我正在寻找一个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的更多信息,并尝试找出我的尝试有什么问题。
答案 0 :(得分:0)
如果你想拥有节点&#34; optional1&#34; ......&#34; optional4&#34;只有一次在特定的部分(不是几次和未分类),那么你必须定义所有可能的顺序,第一个节点是强制性的,以消除歧义。您可能需要多次使用此方法。希望这有帮助,彼得