【问题标题】:Validate an XML-file with only a part of an XSD-file in C#在 C# 中仅使用 XSD 文件的一部分验证 XML 文件
【发布时间】:2012-04-25 22:40:47
【问题描述】:

我有一个 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# xml xsd


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,我试试这个方法!
    【解决方案2】:

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

    【讨论】:

    • 不,我无法重组 XSD 文件。这是我无法控制的。
    • 这不是你无法控制的。您可以操纵提供的架构来创建您想要的架构。事实上,你别无选择——这是解决问题的唯一方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多