XDocument.Validate永远是成功的 [英] XDocument.Validate is always successful

查看:142
本文介绍了XDocument.Validate永远是成功的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有没有定义任何目标命名空间的模式​​文件,即它的定义是这样的:

 < XS:架构的xmlns:XS =htt​​p://www.w3.org/2001/XMLSchema将elementFormDefault =合格>
  &所述;! - 元素,属性等 - >
< / XS:架构>

相应的XML看起来是这样的:

 <文件P1:CRC =0P1:日期=1900-01-01T01:01:01 + 01:00P1:名称=测试P1:状态=新的xmlns:P1 =htt​​p://www.tempuri.org/pdms.xsd的xmlns =htt​​p://www.tempuri.org/pdms.xsd>
  < P1:文件P1:日期=2010-12-23T07:59:45P1:错误code =0P1:的ErrorMessage =P1:数=TEST00001P1:状态=新/>
< /文件>

这对XML使用例如模式验证Altova公司的XMLSpy或氧XML编辑器出现故障。

不过我在C#(.NET 4.0)验证不会失败。 XML是处理为的XDocument 对象。如果我理解正确的话 XDocument.Validate()如果没有命名空间的架构中做了宽松验证。因此,验证不会失败。但是,我又如何能实施的XDocument

一个严验证

这是我尝试验证XML:

 公共静态无效ValidateXml(XML的XDocument,串xsdFilename){
  XmlReaderSettings设置=新XmlReaderSettings();
  XmlSchemaSet中schemaSet =新的XmlSchemaSet();  schemaSet.Add(的String.Empty,xsdFilename);
  settings.ValidationType = ValidationType.Schema;
  settings.ValidationFlags | = XmlSchemaValidationFlags.ReportValidationWarnings;
  settings.ValidationEventHandler + =新的ValidationEventHandler(ValidationCallback);  xml.Validate(schemaSet,ValidationCallback);
}私有静态无效ValidationCallback(对象发件人,ValidationEventArgs参数){
  如果(args.Severity == XmlSeverityType.Warning){
    //做警示的东西...
  }否则如果(args.Severity == XmlSeverityType.Error){
    //做错误的东西...
  }
}


解决方案

我不知道它是可以使用验证方法;如果使用验证XmlReader在何处ValidationFlags都设置发出验证警告,如在XDocument

 的XDocument DOC = XDocument.Load(../../ XMLFile1.xml);        XmlSchemaSet中schemaSet =新的XmlSchemaSet();
        schemaSet.Add(NULL,../../XMLSchema1.xsd);        XmlReaderSettings XRS =新XmlReaderSettings();
        xrs.ValidationType = ValidationType.Schema;
        xrs.ValidationFlags | = XmlSchemaValidationFlags.ReportValidationWarnings;
        xrs.Schemas = schemaSet;
        xrs.ValidationEventHandler + =(O,S)=> {
            Console.WriteLine({0}:{1},s.Severity,s.Message);
        };        使用(XR的XmlReader = XmlReader.Create(doc.CreateReader(),XRS))
        {
            而(xr.Read()){}
        }

那么的ValidationEventHandler并发出对每个节点未找到的架构信息的警告。所以,你可以的ValidationEventHandler检查这样的警告。但是,你还不如简单地调用验证方法之前比较你有架构的目标命名空间doc.Root.Name.Namespace。

I have a schema file which does not define any target namespaces, i.e. its definition looks like this:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <!--Elements, attributes, etc. -->
</xs:schema>

The corresponding XML looks like this:

<Documents p1:CRC="0" p1:Date="1900-01-01T01:01:01+01:00" p1:Name="Test" p1:Status="new" xmlns:p1="http://www.tempuri.org/pdms.xsd" xmlns="http://www.tempuri.org/pdms.xsd">
  <p1:Document p1:Date="2010-12-23T07:59:45" p1:ErrorCode="0" p1:ErrorMessage="" p1:Number="TEST00001" p1:Status="new"/>
</Documents>

Validation of this XML against the schema with e.g. Altova XMLSpy or Oxygen XML Editor fails.

However my validation in C# (.NET 4.0) does not fail. The XML is processed as an XDocument object. If I have understood correctly then XDocument.Validate() does a lax validation if no namespace is found in the schema. Thus the validation does not fail. But then how can I implement a "strict" validation for XDocument?

This is how I try to validate the XML:

public static void ValidateXml(XDocument xml, string xsdFilename) {
  XmlReaderSettings settings = new XmlReaderSettings();
  XmlSchemaSet schemaSet = new XmlSchemaSet();

  schemaSet.Add(string.empty, xsdFilename);
  settings.ValidationType = ValidationType.Schema;
  settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
  settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallback);

  xml.Validate(schemaSet, ValidationCallback);
}

private static void ValidationCallback(object sender, ValidationEventArgs args) {
  if (args.Severity == XmlSeverityType.Warning) {
    // Do warning stuff...
  } else if (args.Severity == XmlSeverityType.Error) {
    // Do error stuff...
  }
}

解决方案

I am not sure it is possible to use the Validate method; if you use a validating XmlReader over the XDocument where ValidationFlags are set up to emit validation warnings, as in

        XDocument doc = XDocument.Load("../../XMLFile1.xml");

        XmlSchemaSet schemaSet = new XmlSchemaSet();
        schemaSet.Add(null, "../../XMLSchema1.xsd");

        XmlReaderSettings xrs = new XmlReaderSettings();
        xrs.ValidationType = ValidationType.Schema;
        xrs.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        xrs.Schemas = schemaSet;
        xrs.ValidationEventHandler += (o, s) => {
            Console.WriteLine("{0}: {1}", s.Severity, s.Message);
        };

        using (XmlReader xr = XmlReader.Create(doc.CreateReader(), xrs))
        {
            while (xr.Read()) { }
        }

then the ValidationEventHandler does emit a warning for each node it does not find schema information for. So your ValidationEventHandler could check for such warnings. But you might as well simply compare the doc.Root.Name.Namespace with the target namespace of the schemas you have before calling the Validate method.

这篇关于XDocument.Validate永远是成功的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆