Ограничение узла группой значений в схеме XML
Я имею дело с 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, чтобы отклонить файлы с недопустимыми значениями, но все, что я пробовал, не удалось: настройка root <aux_dataType>
и ограничение значений в унаследованных <sexType>
или же <stateType>
, используя группы и т. д.
Можете ли вы придумать способ решения этой проблемы, кроме проверки на уровне приложения?
1 ответ
Ограничения на 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.)