1

我有一个包含很多元素的 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 文件?

4

2 回答 2

1

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

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

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

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

于 2012-04-25T14:40:47.410 回答
0

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

于 2012-04-25T13:46:21.683 回答