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

时间:2016-02-29 16:39:18

标签: xml xsd xsd-validation xml-validation

我正在尝试验证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>

1 个答案:

答案 0 :(得分:2)

如果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内容模型中的两个不同位置出现的要求。我无法告诉你,有多少次我看到人们为了纯粹的理论问题而允许元素无序化,这只会使实践中的问题复杂化。