Ограничение узла группой значений в схеме 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.)

Другие вопросы по тегам