如何验证XML文件是否实现了特定的模式

本文关键字:实现 模式 是否 文件 何验证 验证 XML | 更新日期: 2023-09-27 18:15:27

这与Schema验证略有不同。我的问题是,在c#中,您如何不仅可以根据模式检查文档是否有效,还可以验证模式是否实际应用于该文档。我更喜欢。net/c#的答案,但是任何完全尊重文档标准的答案都足够了。

如何验证XML文件是否实现了特定的模式

我正在做一些假设,你到底在寻找什么。

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

首先,我要讲一些背景……"模式"可以是在单个文件中获得的,也可以是分布在多个文件中的。对于多个文件,XSD文件之间可能存在几种关系:包括、导入、重新定义;然后是包含没有目标名称空间的模式文件,由具有目标名称空间的模式文件包含(这通常称为变色龙)。所以我更喜欢用"模式集"来代替"模式"。

有几点需要考虑:

  • "模式集"中的变色龙XSD可能不打算验证具有非限定文档元素的XML。

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

  • 尽管XSD将abc定义为全局元素,但处理以abc为根元素的XML实例可能是不可接受的。

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

考虑到上述逻辑的定义和实现,作为对您问题的回答,我要做的验证将是在特定的XmlSchemaSet中找到非抽象的全局元素(XmlSchemaElement)的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.
    }
}

我希望这至少能帮助你改进你的问题,如果我不在的话。