XSD - 具有必需,可选和无界元素,对订单没有限制

时间:2017-07-31 18:57:05

标签: c# xml xsd xsd-validation xsd.exe

我正在寻找一个XML报告的Schema,它对元素可以出现的顺序没有任何限制,但是有一个元素必须出现一次,元素可以出现一次,元素可以出现任何次数。

我在this question的第二个答案之后创建了一个XSD,因为该解决方案(尽管很难看)应该可以解决我的问题。但是,使用Microsoft的xsd.exe tool为xsd生成类或使用XmlDocument.Validate()会发出以下警告:

  

架构验证警告:元素“optional2”的多个定义会导致内容模型变得模糊不清。必须形成内容模型,以便......

错误发生在第21行,这是第二次'optional2'出现在xsd中。

以下是我对the question I referenced earlier的第二个答案的版本所用的内容。

<xs:group name="unboundedElements">
    <xs:choice>
        <xs:element name="unbounded1" type="unbounded1Type"/>
        <xs:element name="unbounded2" type="unbounded2Type"/>
        <xs:element name="unbounded3" type="unbounded3Type"/>
        <xs:element name="unbounded4" type="unbounded4Type"/>
    </xs:choice>
</xs:group>
<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
            <xs:choice>
                <xs:sequence>
                    <xs:element name="optional1" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="optional2" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="optional3" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="optional4" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="required" type="queryType" maxOccurs="1"/>
                </xs:sequence>
                <xs:sequence>
                    <xs:element name="optional2" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="optional1" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="optional3" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="optional4" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="required" type="queryType" maxOccurs="1"/>
                </xs:sequence>
                <xs:sequence>
                    <xs:element name="optional3" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="optional2" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="optional1" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="optional4" type="xs:string" maxOccurs="1" minOccurs="0"/>
                    <xs:group ref="unboundedElements" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="required" type="queryType" maxOccurs="1"/>
// And so on, since this is 5! = 120 permutations
                </xs:sequence>
           </xs:choice>
       </xs:sequence>
    </xs:complexType>
</xs:element>

我希望有人可以指出并解释我做错了什么。

我可以通过在所有元素周围使用<xs:choice maxOccurs="unbounded">标签来“验证”xml,因为这样可以使顺序无关紧要,但它不会对xml文档施加任何必要的限制

另外,我知道xsd 1.1允许maxOccurs="unbounded"使用<xs:all>来完全解决问题,但.NET不支持使用xsd 1.1。

我认为我最好的解决方案可能只是通过在验证之前对xml节点进行排序来强制执行严格的元素排序(允许xsd文档更加简单和正确),但我仍然希望了解有关xsd的更多信息,并尝试找出我的尝试有什么问题。

1 个答案:

答案 0 :(得分:0)

如果你想拥有节点&#34; optional1&#34; ......&#34; optional4&#34;只有一次在特定的部分(不是几次和未分类),那么你必须定义所有可能的顺序,第一个节点是强制性的,以消除歧义。您可能需要多次使用此方法。希望这有帮助,彼得