xsd - 序列与选择

时间:2014-06-23 19:03:59

标签: xml xsd

我对XML Schema序列感到困惑 根据w3schools.com,
The sequence element specifies that the child elements must appear in a sequence. Each child element can occur from 0 {{ 1}}
如果必须出现每个元素,它怎么会出现0次?不会破坏 必须出现 规则吗?


另一件事,

之间有什么区别
to any number of times.

和此:

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

你不能为这两种情况添加任何数量的每个元素吗?是否有任何区别?

2 个答案:

答案 0 :(得分:9)

序列中的元素必须以架构中指定的顺序出现。但是如果使用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>
</employee>

但是你不能混合元素的顺序。所以这将是无效的。

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

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

答案 1 :(得分:2)

不幸的是,有另一种方法可以使用选择 - 如果是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>