这与仅 Schema 验证略有不同。我在问如何在 C# 中检查该文档不仅对模式有效,而且还验证该模式是否实际适用于该文档。我更喜欢 .NET / C# 答案,但任何完全尊重文档标准的答案就足够了。
1 回答
我正在对您正在寻找的内容做出一些假设。
对我说“特定模式”意味着您有一个模式,并且您正在筛选 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.
}
}
如果我不在,我希望这至少可以帮助您改善您的问题。