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

时间:2012-04-25 13:43:23

标签: c# xml xsd

我有一个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文件?

2 个答案:

答案 0 :(得分:1)

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

一种简单的方法是遵循以下步骤:

  • 将原始XSD读取为纯XML文件;使用XPath找到你想要使用的节点,并坚持下去。
  • 创建一个新的XML文档;使用appropriace命名空间创建文档元素为模式;使用适当的值为targetNamespace创建(或不创建)属性;对于elementFormDefault也是如此;
  • 深入克隆并复制您在上面创建的架构元素下的 In 节点定义
  • 从新创建的文档元素节点创建XmlNodeReader。
  • 使用XmlSchema.Read(nodeReader)读取架构
  • 使用XmlSchemaSet进行编译;如果成功,请使用该模式集进行验证。

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

答案 1 :(得分:0)

您需要重新构建XSD。使所有元素兄弟姐妹(在顶层)。在定义关系时,使用element ref=...来引用另一个。然后你的XSD将能够验证任何顶级元素。