我正在处理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}},使用群组等
除了在应用级别进行验证之外,您能想到解决此问题的方法吗?
答案 0 :(得分:0)
ID和描述的约束取决于父元素。您可以通过使用其父级的ID
和Description
元素声明来使它们的声明依赖于相同的方式:
<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。)