質問

すでに生産されており、変更できないXMLドキュメント構造があります。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<root xmlns="http://www.domain_name.com/MySchema">
    <optionalString1>a</optionalString1>
    <optionalString2>b</optionalString2>
    <optionalDependee1>c</optionalDependee1>
    <dependent1_1>d</dependent1_1>
    <dependent1_2>e</dependent1_2>
    <optionalString3>f</optionalString3>
    <optionalDependee2>g</optionalDependee2>
    <dependent2_1>h</dependent2_1>
    <dependent2_2>i</dependent2_2>
    <!-- more and more elements -->
</root>

XSDで表現しようとしている制限は次のとおりです。

  1. XML要素は任意の順序で表示できます。
  2. 「OptionalStringX」および「OptionAldEpendeEx」が特定のファイルに存在する場合と存在しない場合があります。
  3. 「optionaldependeex」が存在する場合、「depententx_1」と「dependentx_2」が存在する必要があります。それ以外の場合、「optionaldependeex」が存在しない場合、「depententx_1」または「dependentx_2」も存在しません。

「complexType」と「グループ」を使用していくつかのバレーションを試しましたが、有効なXSDではありません(少なくともVS2010によると)。私の「グループ」の実装は次のようなものです。

<xs:schema>

<xs:group name="BaseGroup">
  <xs:all>
    <xs:element name="optionalString1" type="xs:string" minOccurs="0" />
    <xs:element name="optionalString2" type="xs:string" minOccurs="0" />
    <xs:element name="optionalString3" type="xs:string" minOccurs="0" />
  </xs:all>
</xs:group>

<xs:group name="DependentGroup1">
  <xs:all>
    <xs:element name="optionalDependee1" type="xs:string" minOccurs="1" />
    <xs:element name="dependent1_1" type="xs:string" minOccurs="1" />
    <xs:element name="dependent1_2" type="xs:string" minOccurs="1" />
  </xs:all>
</xs:group>

<xs:group name="DependentGroup2">
  <xs:all>
    <xs:element name="optionalDependee2" type="xs:string" minOccurs="1" />
    <xs:element name="dependent2_1" type="xs:string" minOccurs="1" />
    <xs:element name="dependent2_2" type="xs:string" minOccurs="1" />
  </xs:all>
</xs:group>

<xs:group name="Combo1">
  <xs:all>
    <!-- The 'http://www.w3.org/2001/XMLSchema:group'
         element is not supported in this context. -->
    <xs:group ref="BaseGroup"/>
    <xs:group ref="DependentGroup1"/>
  </xs:all>
</xs:group>

<xs:group name="Combo2">
  <xs:all>
    <!-- The 'http://www.w3.org/2001/XMLSchema:group'
         element is not supported in this context. -->
    <xs:group ref="BaseGroup"/>
    <xs:group ref="DependentGroup1"/>
    <xs:group ref="DependentGroup2"/>
  </xs:all>
</xs:group>

<xs:complexType name="RootType">
  <xs:choice minOccurs="1" maxOccurs="1">
    <xs:group ref="BaseGroup" />
    <xs:group ref="Combo1" />
    <xs:group ref="Combo2" />
  </xs:choice>
</xs:complexType>

<xs:element name="root" type="RootType" />

</xs:schema>

私はXMLを検証するためのスキーマを初めて使用しており、これまで常にXSDがすべての有効なXMLの構造を表現するのに十分な柔軟性があると仮定してきました。 XMLファイルの構造を書き換えることができれば、依存関係を表現するため、OptionAldependeEXの属性またはサブエレメントのいずれかをdependentX_1とdependentX_2のいずれかにします。

  1. これらの制限はXSDスキーマで表すことができますか? XSDは、ツールとサポートが他の検証ソリューションよりもはるかに広くなっていることを理解しているため、XSDに固執しようとしています。
  2. そうでない場合、Python、Perl、CまたはC ++のいずれかで優れたサポートがあり、XSDよりも複雑なドキュメント構造を処理できる他のXML Balidatorがどの他のXMLバリデーターを持っていますか? RelaxngまたはSchematronはぴったりでしょうか?長所と短所? XSD以外に何も使用したことがありません。
役に立ちましたか?

解決

あなたが正しく行ったように、XSDを使用して注文をリラックスさせることができます。あなたがやろうとしている他のすべてを除くすべてはサポートされていません。 XMLスキーマの次のバージョン, 、1.1ですが、他のバリエーションのいくつかをサポートできます。しかし、1.1は最終的なものではなく、これを理解するライブラリは多くありません。私はあなたが見ていることをお勧めします スキーマトロン そして、それが役立つかどうかを確認します。

他のヒント

XSDはすべての有効なXMLの構造を表すのに十分な柔軟性があると常に想定していました

いいえ、それは真実からはほど遠いです - 少なくともXSD 1.0では。実際、要素が任意の順序で表示されることを許可する場合、どの要素が表示され、どの要素がオプションであるかを言う以外に、課すことができる制約はほとんどありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top