すでに本番環境にあり、変更できない次の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で表現しようとしている制限は次のとおりです。
- XML要素は任意の順序で表示できます。
- 「optionalStringX」および「optionalDependeeX」は、特定のファイルに存在する場合と存在しない場合があります。
- 「optionalDependeeX」が存在する場合、「dependentX_1」と「dependentX_2」が存在する必要があります。それ以外の場合、「optionalDependeeX」が存在しない場合、「dependentX_1」も「dependentX_2」も存在しません。
'complexType'と'group'を使用していくつかのバリエーションを試しましたが、それらは有効な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ファイルの構造を書き直すことができれば、dependentX_1とdependentX_2をoptionalDependeeXの属性またはサブ要素のいずれかにします。これは、これらが依存関係を表すためです。
- これらの制限をXSDスキーマで表すことはできますか?ツールとそのサポートは他の検証ソリューションよりもはるかに普及していると私は理解しているので、可能であればXSDを使い続けるようにしています。
- そうでない場合、Python、Perl、およびCまたはC ++のいずれかで適切にサポートされ、XSDよりも複雑なドキュメント構造を処理できる他のXMLバリデーターはどれですか?RelaxNGまたはSchematronが適していますか?長所と短所?XSD以外は使用したことがありません。