具有任意顺序元素和无限重数的XSD

具有任意顺序元素和无限重数的XSD,xsd,Xsd,我需要生成一个XSD。在根元素下,7个不同元素中的任何一个可以出现0、1或多个,并且这些元素可以以任意顺序出现 我不能使用sequence,因为元素不一定按预定义的顺序排列。这是一个有效的模式,但它施加了太严格的限制: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="data"> <xs:complexType> <xs:sequence> 我

我需要生成一个XSD。在根元素下,7个不同元素中的任何一个可以出现0、1或多个,并且这些元素可以以任意顺序出现

我不能使用sequence,因为元素不一定按预定义的顺序排列。这是一个有效的模式,但它施加了太严格的限制:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
<xs:complexType>
<xs:sequence>

我不能全部使用,因为它不允许maxOccurs是无界的,所以这是一个无效的架构:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
<xs:complexType>
<xs:all>
<xs:element name="address" minOccurs="0" maxOccurs="unbounded">


我觉得我遇到了XSD的另一个限制,但我只是想问一下,因为我是XML模式的新手。

在每个元素上使用带有
maxOccurs=“1”
选项。这将确保a、b或c中至少有一个,但每个中不超过一个

<xs:choice minOccurs="1" maxOccurs="unbounded">
  <xs:element name="a" maxOccurs="1"/>
  <xs:element name="b" maxOccurs="1"/>
  <xs:element name="c" maxOccurs="1"/>
</xs:choice>

以下所有内容在此架构下均有效:

<root>
    <a/>
</root>

<root>
    <a/>
    <b/>
</root>

<root>
    <b/>
    <a/>
</root>

<root>
    <c/>
    <a/>
</root>

<root>
    <a/>
    <c/>
    <b/>
</root>

在每个元素上使用带有
maxOccurs=“1”
选项
块。这将确保a、b或c中至少有一个,但每个中不超过一个

<xs:choice minOccurs="1" maxOccurs="unbounded">
  <xs:element name="a" maxOccurs="1"/>
  <xs:element name="b" maxOccurs="1"/>
  <xs:element name="c" maxOccurs="1"/>
</xs:choice>

以下所有内容在此架构下均有效:

<root>
    <a/>
</root>

<root>
    <a/>
    <b/>
</root>

<root>
    <b/>
    <a/>
</root>

<root>
    <c/>
    <a/>
</root>

<root>
    <a/>
    <c/>
    <b/>
</root>


谢谢克雷格,这很有效。实际上,我使用了
minOccurs=0
,因为只提供根元素而不提供其他元素是可以接受的(尽管不常见)。这里有两点值得注意的细节:(1)maxOccurs=“1”是默认值,因此无需显式指定;(2)在可重复的选择中,maxOccurs对有效实例集没有影响:(a | b)+定义与(a+| b+)相同的语言。解决方案的关键点是:使用可重复的选择。为了符合您的要求,选择应该是minOccurs=“0”是的,您是对的。我已经使用了
minOccurs=“0”
,但是我已经删除了所有出现的
minOccurs=“1”
maxOccurs=“1”
,并且仍然有效。谢谢Craig,这很有效。实际上,我使用了
minOccurs=0
,因为只提供根元素而不提供其他元素是可以接受的(尽管不常见)。这里有两点值得注意的细节:(1)maxOccurs=“1”是默认值,因此无需显式指定;(2)在可重复的选择中,maxOccurs对有效实例集没有影响:(a | b)+定义与(a+| b+)相同的语言。解决方案的关键点是:使用可重复的选择。为了符合您的要求,选择应该是minOccurs=“0”是的,您是对的。我已经使用了
minOccurs=“0”
,但是我已经删除了所有出现的
minOccurs=“1”
maxOccurs=“1”
,并且仍然有效。