如何验证XML文件是否实现特定架构

时间:2013-05-26 04:22:18

标签: c# .net xml validation xsd

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

1 个答案:

答案 0 :(得分:1)

我正在假设你究竟在寻找什么。

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

首先,我将介绍一些背景......“架构”可以是一个文件,也可以分布在多个文件中。对于多个文件,XSD文件之间可能存在一些关系:include,import,redefine;然后是具有目标命名空间的模式文件(通常称为 chameleon )的包含没有目标命名空间的模式文件。因此,我宁愿使用术语“架构集”而不是“架构”。

然后要考虑的一些事情:

  • “架构集”中的变色龙XSD可能无法验证具有非限定文档元素的XML。

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

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

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

考虑到以某种方式定义和实现的上述逻辑,作为对您的问题的答案,我将做的验证将是找到非抽象的全局元素的XSD定义 - XmlSchemaElement - 特定XmlSchemaSet,使用我正在验证的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.
    }
}

如果我离开,我希望这至少可以帮助你改善你的问题。