0

すでに本番環境にあり、変更できない次の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」が存在する場合、「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の属性またはサブ要素のいずれかにします。これは、これらが依存関係を表すためです。

  1. これらの制限をXSDスキーマで表すことはできますか?ツールとそのサポートは他の検証ソリューションよりもはるかに普及していると私は理解しているので、可能であればXSDを使い続けるようにしています。
  2. そうでない場合、Python、Perl、およびCまたはC ++のいずれかで適切にサポートされ、XSDよりも複雑なドキュメント構造を処理できる他のXMLバリデーターはどれですか?RelaxNGまたはSchematronが適していますか?長所と短所?XSD以外は使用したことがありません。
4

2 に答える 2

1

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

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

于 2011-03-15T21:29:52.163 に答える
1

正しく実行したので、xsd:allを使用して順序を緩和できますが、実行しようとしている他のことはサポートされていません。次のバージョンのXMLスキーマである1.1は、他のいくつかのバリアントをサポートできます。しかし、1.1は最終的なものではなく、これを理解しているライブラリは多くありません。スキマトロンを見て、それが役立つかどうかを確認することをお勧めします 。

于 2011-03-15T17:32:49.787 に答える