【问题标题】:XPathNavigator.CheckValidity validates invalid XML documentXPathNavigator.CheckValidity 验证无效的 XML 文档
【发布时间】:2010-12-03 16:06:37
【问题描述】:

我正在尝试使用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# 尝试了解决方案,但我得到了相同的结果......我必须在这个验证的工作原理上遗漏了一些重要的考虑,但我看不到它......

【问题讨论】:

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


    【解决方案1】:

    问题在于您的 XML 使用默认命名空间,但 XSD 指定了目标命名空间。如果您在 XML 中指定 &lt;BadManifest xmlns="http://www.engagesoftware.com/Schemas/EngageManifest"&gt;,您应该会发现验证器按预期报告错误。否则,由于它无法识别 XML 的命名空间,它只是忽略它。

    【讨论】:

    • 那么,有没有一种方法可以验证架构而不需要文档中的 xmlns?是否无法使用指定 targetNamespace 的 XSD 验证没有 xmlns 的文档?
    • 基本上它们必须匹配——就 XML 而言,具有相同名称但不同命名空间的元素没有任何关系。您的选择是在 XSD 中省略 targetNamespace,或者在 XML 中设置名称空间。您可以在解析 XML 后以编程方式在 XML 中设置名称空间,但如果您需要这样做,那么您需要仔细考虑您的名称空间的目的是什么,以及为什么您的输入 XML 一开始不在该名称空间中地点。
    • 这是针对用户提供的模板文档的,因此要求它们包含命名空间似乎是一个太大的负担。我希望有一个命名空间,以便智能感知更加自动化,但看起来只删除命名空间可能是最简单的,如果他们想要智能感知,他们可以手动与 XSD 关联。
    • 因为我们已经创建了指定和不指定命名空间的模板,所以我创建了一个没有指定目标命名空间的清单副本,并将两个版本都添加到XmlSchemaSet
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多