2

这与仅 Schema 验证略有不同。我在问如何在 C# 中检查该文档不仅对模式有效,而且还验证该模式是否实际适用于该文档。我更喜欢 .NET / C# 答案,但任何完全尊重文档标准的答案就足够了。

4

1 回答 1

2

我正在对您正在寻找的内容做出一些假设。

对我说“特定模式”意味着您有一个模式,并且您正在筛选 XML 文件,试图首先了解该模式是否应该用于验证 XML。

首先,我会介绍一些背景......“模式”可能是一个文件中的一个,或者分布在多个文件中。对于多个文件,XSD 文件之间可能存在几种关系:包含、导入、重新定义;然后是包含没有目标命名空间的模式文件,由具有目标命名空间的模式文件(这通常称为chameleon)。因此,我宁愿使用术语“模式集”而不是“模式”。

那时要考虑的一些事情:

  • 您的“模式集”中的变色龙 XSD 可能并非旨在验证具有不合格文档元素的 XML。

  • 不应使用重新定义的 XSD 来验证匹配的 XML 内容;重新定义 XSD 应该。

  • 即使 XSD 将abc定义为全局元素,处理以 abc 作为根元素的 XML 实例也是不可接受的。

以上是为了表明即使 XML 可能看起来实现了“特定模式”,但它本身并不意味着它与 XSD 的作者放置在该模式中的意图相匹配。

考虑到上述逻辑以某种方式定义和实现,作为对您的问题的回答,我要做的验证是使用完全限定的XmlSchemaSet在特定XmlSchemaSet中找到非抽象全局元素的 XSD 定义我正在验证的 XML 中根元素的名称。

System.Xml.Schema.XmlSchemaSet xset = ...; // Loaded somehow
System.Xml.XmlQualifiedName qn = ...; // LocalName + NamespaceURI
if (xset.GlobalElements.Contains(qn))
{
    System.Xml.Schema.XmlSchemaElement el = (System.Xml.Schema.XmlSchemaElement)xset.GlobalElements[qn];
    if (!el.IsAbstract)
    {
        // The XML file may implement the schemata loaded in this schema set.
    }
}

如果我不在,我希望这至少可以帮助您改善您的问题。

于 2013-05-26T15:52:42.753 回答