繁体   English   中英

XDocument.Validate总是成功的

[英]XDocument.Validate is always successful

我有一个架构文件,该文件未定义任何目标名称空间,即其定义如下所示:

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

相应的XML如下所示:

<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>

使用Altova XMLSpy或Oxygen XML Editor对XML进行的模式验证失败。

但是,我在C#(.NET 4.0)中的验证不会失败。 XML被作为XDocument对象处理。 如果我正确理解,那么如果在架构中找不到名称空间,则XDocument.Validate()会进行宽松的验证。 因此,验证不会失败。 但是,如何为XDocument实施“严格”验证?

这就是我尝试验证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...
  }
}

我不确定是否可以使用Validate方法。 如果在XDocument上使用验证XmlReader,在XDocument上设置了ValidationFlags以发出验证警告,如

        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()) { }
        }

然后ValidationEventHandler会针对找不到其架构信息的每个节点发出警告。 因此,您的ValidationEventHandler可以检查此类警告。 但是您最好在调用Validate方法之前将doc.Root.Name.Namespace与模式的目标名称空间进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM