0

私は構造を持つ「補助データ」を持つ多くのノードがあるxmlファイルを扱っています:

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

それぞれの「何か」について、値のいくつかのグループのみが有効です。

たとえば、これらの「何か」のいずれかが である場合<sex>、次の 2 つの値のみが有効になります。

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

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

<state>次の 3 つの値だけであれば問題ありません。

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

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

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

<aux_dataType>XML スキーマ検証を使用して、無効な値を持つファイルを拒否したいのですが、ルートを設定し、継承された<sexType>orの値を制限し<stateType>、グループを使用するなど、試したことはすべて失敗しました。

アプリ レベルで検証する以外に、この問題に対処する方法を考えられますか?

4

1 に答える 1

0

ID と Description の制約は、親要素によって異なります。親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>and <state>erased</state>、または (これらは他のオブジェクトのプロパティに見えるため) 属性として使用する可能性が高くなります: ... sex="male"、 ... state="erased". (また、人間の性別にコード化された値を使用したい場合は、おそらく ISO 5218 を参照する必要があります。)

于 2013-11-11T23:57:20.847 に答える