XPathNavigator.CheckValidity验证无效的XML文档

时间:2010-12-03 16:06:37

标签: .net xml .net-3.5 xsd xml-validation

我正在尝试使用XPathNavigator.CheckValidity来验证XML文档。不知何故,我能够编写使用此方法传递的测试,但现在(神秘地)不再通过了。我能想到的唯一改变的是从.NET 2迁移到.NET 3.5,但是我找不到任何关于转换过程中发生变化的文档。

这是一个示例程序:

void Main()
{
    try
    {
        GetManifest().CreateNavigator().CheckValidity(GetSchemaSet(), (sender, args) => {
            // never get in here when debugging
            if (args.Severity == XmlSeverityType.Error) {
                throw new XmlSchemaValidationException("Manifest failed validation", args.Exception);
            }
        }); // returns true when debugging
    }
    catch (XmlSchemaValidationException)
    {
        // never get here
        throw;
    }

    // code here runs
}

IXPathNavigable GetManifest()
{
    using (TextReader manifestReader = new StringReader("<?xml version='1.0' encoding='utf-8' ?><BadManifest><bad>b</bad></BadManifest>"))
    {
        return new XPathDocument(manifestReader);
    }
}

XmlSchemaSet GetSchemaSet() 
{
    var schemaSet = new XmlSchemaSet();
    using (var schemaReader = new StringReader(Schema)){
        schemaSet.Add(XmlSchema.Read(schemaReader, null));
    }

    return schemaSet;
}

const string Schema = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<xs:schema attributeFormDefault=""unqualified"" elementFormDefault=""qualified"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""http://www.engagesoftware.com/Schemas/EngageManifest"">
  <xs:element name=""EngageManifest"">
    <xs:complexType>
      <xs:all>
        <xs:element name=""Title"" type=""xs:string"" />
        <xs:element name=""Description"" type=""xs:string"" />
      </xs:all>
    </xs:complexType>
  </xs:element>
</xs:schema>";

我已经在Validate XML with a XSD Schema without changing the XML using C#尝试了解决方案,但我得到了相同的结果......我必须在这个验证方法的工作原理中缺少一些重要的考虑因素,但我看不到它......

1 个答案:

答案 0 :(得分:3)

问题是您的XML使用默认命名空间,但XSD指定了目标命名空间。如果在XML中指定<BadManifest xmlns="http://www.engagesoftware.com/Schemas/EngageManifest">,则应该发现验证程序按预期报告错误。否则,因为它无法识别XML的命名空间,所以它只是忽略它。