验证XML时如何正确使用序列标签?

How to correctly use sequence tag when validating XML?

我正在尝试验证 XML,如下所示。我有 3 个元素 nameageaddress 必须按该顺序声明(因此是序列标记)。然而,作业元素应该被允许显示在任何地方(即:在这个元素序列之前或之后)。这可能使用 XSD 验证吗?目前我只能让它接受在这些元素之后添加它,因为这是它在序列中的位置。我也尝试过将 xs:choicexs:sequence 混合使用,但没有成功。

<xs:complexType name="PersonNode">
    <xs:sequence>
        <xs:element name="name" type="tns:StringLabel"/>
        <xs:element name="age" type="xs:string"/>
        <xs:element name="address" type="xs:string"/>
        <xs:element name="job" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="valid" type="xs:boolean"/>
</xs:complexType>

如果job不是必须的,你可以使用xs:choice来实现你想要的约束,如下所示:

  <xs:complexType name="PersonNode">
    <xs:choice>
      <xs:sequence>
        <xs:element name="name" type="tns:StringLabel"/>
        <xs:element name="age" type="xs:string"/>
        <xs:element name="address" type="xs:string"/>
        <xs:element name="job" type="xs:string"/>
      </xs:sequence>
      <xs:sequence>
        <xs:element name="job" type="xs:string"/>
        <xs:element name="name" type="tns:StringLabel"/>
        <xs:element name="age" type="xs:string"/>
        <xs:element name="address" type="xs:string"/>
      </xs:sequence>
    </xs:choice>
    <xs:attribute name="valid" type="xs:boolean"/>
  </xs:complexType>

但是,这假定 job 需要在一个地方或另一个地方;否则,这将 运行 违反唯一粒子属性。 [更新:不要错过 C. M. Sperberg-McQueen 在评论中关于允许 job 是可选的想法。它通过将第二个选择用于领先的 job 案例,同时让第一个选择涵盖没有 job 和尾随 job 的案例,巧妙地避开了 UPA。]

考虑到所有因素,我建议您采用原来的方法并放弃允许 job 出现在 PersonNode 的内容模型中的两个不同位置的要求。我无法告诉你有多少次我看到人们为了纯粹的理论问题而努力允许元素无序,这只会使实践中的事情复杂化。