Xml xsd-序列与选择

Xml xsd-序列与选择,xml,xsd,Xml,Xsd,我对XML模式序列感到困惑 根据w3schools.com, 序列元素指定子元素必须按顺序出现。每个子元素可以从0到任意次数出现。 如果每个元素必须出现,它怎么会出现0次?这难道不会打破必须出现的规则吗 还有一件事,它们之间的区别是什么 <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="choiceA" type="xs:string" > <xs:element name=

我对XML模式序列感到困惑 根据w3schools.com,
序列元素指定子元素必须按顺序出现。每个子元素可以从
0
到任意次数出现。

如果每个元素必须出现,它怎么会出现0次?这难道不会打破必须出现的规则吗


还有一件事,它们之间的区别是什么

<xs:choice minOccurs="0" maxOccurs="unbounded">
  <xs:element name="choiceA" type="xs:string" >
  <xs:element name="choiceB" type="xs:string" />
</xs:choice>

这是:

<xs:sequence minOccurs="0" maxOccurs="unbounded">
  <xs:element name="choiceA" type="xs:string" >
  <xs:element name="choiceB" type="xs:string" />
</xs:sequence>


你不能为这两种情况下的每一个元素加上任何数量吗?有什么区别吗?

序列中的元素必须按照架构中指定的顺序出现。但是,如果元素是用minOccurs=“0”定义的,则它不必出现

这里有一个类似于w3schools.com教程的示例。我刚刚将minOccurs=“0”添加到firstname元素中

<xs:element name="employee">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" minOccurs="0"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

在这种情况下,基于此定义的有效xml元素将是

<employee>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</employee>

约翰
史密斯
或者删除firstname元素,因为它具有minOccurs=“0”


史密斯
但是,不能混合元素的顺序。所以这是无效的

<employee>
  <lastname>Smith</lastname>
  <firstname>John</firstname>
</employee>

史密斯
约翰

至于选择和顺序之间的区别。choice元素只允许其中一个元素出现。因此,可以选择choiceA或choiceB,但不能同时选择两者。尽管序列的定义方式不同,但每个序列元素都有一个choiceA和一个choiceB。

不幸的是,还有另一种使用选择的方式——在0到无界的情况下,可能有多个相同类型的元素,也可能没有

例如:

 <xs:element name="module">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded" minOccurs="0">
        <xs:element ref="active"/>
        <xs:element ref="debug"/>
        <xs:element name="name">
      </xs:choice>
    </xs:complexType>
  </xs:element>

将接受以下XML格式:

<samba>
    <active>off</active>
    <name>Box</name>
</samba>

关
盒子
并将接受以下两种XML:

<samba>
    <debug>off</debug>
    <active>off</active>
    <debug>off</debug>
    <name>Box</name>
    <debug>off</debug>
</samba>

关
关
关
盒子
关

谢谢,这非常有帮助。但是,如果为一个选项设置maxOccurse=“unbounded”,那么每个元素的数量就不能满足您的需要吗?根据定义的选项:您仍然只能有choiceA或choiceB,但可以有任意数量的choosen元素。
<samba>
    <debug>off</debug>
    <active>off</active>
    <debug>off</debug>
    <name>Box</name>
    <debug>off</debug>
</samba>