XML模式:使用<xs:all>与在minOccurs =“ 0”时不使用时之间的区别

时间:2018-08-06 20:29:48

标签: xml xsd xsd-validation xml-validation

两者之间有什么区别(摘自<xs:all>的w3schools.com参考资料):

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

这:

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

请注意,每个子元素都包含minOccurs="0",并注意第二个示例中缺少<xs:all>标签。

据我所知,如果子元素未指定minOccurs="0",则<xs:all>会这样,因此整个组根本不会出现。不使用<xs:all>意味着所有子元素必须出现一次,因为元素中minOccursmaxOccurs的默认值为1。

但是,当您在所有子元素上都指定minOccurs="0"时,两个示例是否会成为相同的约束?两者都不意味着每个元素只能出现一次还是不出现?

<xs:all>元素用处不大。也许你可以告诉我它在哪里有用。

1 个答案:

答案 0 :(得分:3)

您的第二个示例不是有效的XSD,因为xs:element不能作为xs:complexType的子代出现。假设您的第二个示例实际上是

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

然后,我们可以解释何时使用以下内容:

  • 元素订购 重要 时,使用xs:sequence
  • 当元素顺序 无关紧要 时使用xs:all

在两种情况下,minOccurs="0"表示关联的元素是可选的。

因此,在您的(固定)情况下,您的xs:all示例将允许firstnamelastname以子顺序出现在person上。您的xs:sequence示例将约束firstname作为lastname的子代出现在之前 person