0

我正在处理 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><stateType>使用组等。

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

4

1 回答 1

0

ID 和 Description 的约束取决于父元素。你可以使它们的声明以同样的方式依赖,通过使用它们的父元素的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>and <state>erased</state>, or (因为这些看起来是其他对象的属性)更可能是属性: ... sex="male", ... state="erased"。(如果你想对人类的性别使用编码值,你应该看看 ISO 5218。)

于 2013-11-11T23:57:20.847 回答