在 C# 中仅使用 XSD 文件的一部分来验证 XML 文件

本文关键字:文件 一部分 验证 XML XSD | 更新日期: 2023-09-27 18:32:24

我有一个XSD文件,里面有很多元素。对于该XSD文件的一部分,我需要验证传入的XML文件。

例如:

这是有效的 XML

<in attr1="9" attr2="0" attr3="0" />

这是 XSD 文件。只有元素"FindPerson"下名为"In"的元素是验证XML文件所必需的。

<xs:element name="WS">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ELEMENT1">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="FindPerson">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="In">
                                            <xs:complexType>
                                                <xs:attribute name="attr1" type="xs:int"/>
                                                <xs:attribute name="attr2" type="xs:boolean" use="optional" default="0"/>
                                                <xs:attribute name="attr3" type="xs:boolean" use="optional" default="0"/>
                                            </xs:complexType>
                                        </xs:element>
...

有没有办法在 C# 中仅使用部分 XSD 文件来验证 XML 文件?

在 C# 中仅使用 XSD 文件的一部分来验证 XML 文件

这实际上可以通过您进行一些工作来实现,并假设您的 XSD 确实是使用俄罗斯娃娃样式(所有内容嵌套)创作的,正如您截断的 XSD 所暗示的那样。

一个简单的方法是按照以下步骤操作:

  • 将原始 XSD 读取为纯 XML 文件;使用 XPath 找到要使用的节点,并保留它。
  • 创建一个新的 XML 文档; 创建文档元素作为模式,具有适当的命名空间; 为具有适当值的 targetNamespace 创建(或不创建)属性; 元素表单默认相同;
  • 深层克隆并在上面创建的架构元素下复制 In 节点定义
  • 从新创建的文档元素节点创建 XmlNodeReader。
  • 使用 XmlSchema.Read(nodeReader) 读取架构
  • 使用 XmlSchemaSet 进行编译;如果成功,请使用该架构集进行验证。

这里的想法是在内存中创建飞行中所需的架构。如果内容模型更复杂(不是俄罗斯娃娃),那么事情很容易复合到不可行的地步。

您需要重组 XSD。 使所有元素成为同级元素(在顶层)。使用 element ref=... 在定义它们的关系时从另一个引用一个。 然后,您的 XSD 将能够验证任何顶级元素。