将节点限制为XML架构中的一组值

时间:2013-11-11 13:07:14

标签: xml validation xsd

我正在处理xml文件,其中有许多带有“辅助数据”的节点,其结构如下:

<something>
  <ID>...</ID>
  <Description>...</Description>
</something>

对于每个“某事”,只有一些价值观有效。

例如,如果其中一个“某事”是<sex>,则只有以下两个值有效:

<sex>
  <ID>00</ID>
  <Description>male</Description>
<sex>

<sex>
  <ID>01</ID>
  <Description>female</Description>
<sex>

如果是<state>,则只有以下三个值可以:

<state>
  <ID>100</ID>
  <Description>downloaded</Description>
</state>

<state>
  <ID>110</ID>
  <Description>printed</Description>
</state>

<state>
  <ID>120</ID>
  <Description>erased</Description>
</state>

我想使用XML架构验证来拒绝包含无效值的文件,但我尝试过的所有内容都失败了:设置根<aux_dataType>并限制继承的<sexType>或{中的值{1}},使用群组等

除了在应用级别进行验证之外,您能想到解决此问题的方法吗?

1 个答案:

答案 0 :(得分:0)

ID和描述的约束取决于父元素。您可以通过使用其父级的IDDescription元素声明来使它们的声明依赖于相同的方式:

<xs:element name="state">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="ID" type="state-ID"/>
      <xs:element name="Description" type="state-desc"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="sex">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="ID" type="sex-ID"/>
      <xs:element name="Description" type="sex-desc"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:simpleType name="state-ID">
  <xs:restriction base="xs:NMTOKEN">
    <xs:enumeration value="100"/>
    <xs:enumeration value="110"/>
    <xs:enumeration value="120"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="state-desc">
  <xs:restriction base="xs:NMTOKEN">
    <xs:enumeration value="downloaded"/>
    <xs:enumeration value="printed"/>
    <xs:enumeration value="erased"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="sexID">
  <xs:restriction base="xs:NMTOKEN">
    <xs:enumeration value="00"/>
    <xs:enumeration value="01"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="sex-desc">
  <xs:restriction base="xs:NMTOKEN">
    <xs:enumeration value="male"/>
    <xs:enumeration value="female"/>
  </xs:restriction>
</xs:simpleType>

请注意,这并未解决一致性要求:如果我了解您的设计,则Description元素完全是冗余的,所有信息都由ID传达 - 反之亦然。在现实生活中,我更简单地设计XML:<sex>male</sex><state>erased</state>,或者(因为它们看起来是其他对象的属性)更可能作为属性:... sex="male" ,...... state="erased"。 (如果你想使用人类性别的编码值,你应该看看ISO 5218。)