2009-04-07 17 views
1

私は常にXMLSchemasとDTDが同等であることを理解しましたが、後者は継承のような複雑な関係をモデル化する際には扱いにくいです。使用 を<データ内部DTDとXMLSchemasの等価性

<data> 
<array> 
    <int></int> 
    <int></int> 
</array> 
</array> 
    <float></float> 
    <float></float> 
</array> 
<int><int> 
<float></float> 
</data> 

要素>どのような順序で表示することができ、それぞれがカーディナリティ0 ..のです*:

は最近、私はこのような構造を有しているドキュメントを検証するために、スキーマを構築したいです xs:all>の要素を持つことができますが、最大基数は1です。< xs:sequence>と< xs:choice>は他の明白な候補ですが、私が望むものよりも制限的です。

は、それから私は、DTDはそうのようにこれを達成することができるように見えることに気づいた:

<!ELEMENT data (array | float | int)*> 

は、同等のスキーマを構築する方法はありますか私はここのDTDを使用する必要がありますか?

答えて

0

:ここ

は、あなたのXMLファイルに合ったサンプルXSDです。 Infactは、XMLスキーマを使用して元の問題を解決できます。

正しいアプローチは、すべてのさまざまなオプション(int、float、配列)の間に選択肢を含むgroup要素を定義することです。各要素にはカーディナリティ0 .. *があります。ここから

<xs:group name="dataTypesGroup"> 
    <xs:choice> 
     <xs:element name="int" type="intType"/> 
     <xs:element name="float" type="floatType"/> 
     <xs:element name="array"> 
      <xs:complexType> 
       <xs:choice> 
        <xs:element name="int" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/> 
        <xs:element name="float" type="xs:float" minOccurs="0" maxOccurs="unbounded"/> 
       </xs:choice> 
       <xs:attribute name="id" use="required"></xs:attribute> 
      </xs:complexType>  
     </xs:element> 
    </xs:choice> 
</xs:group> 

は、それが出来上がり

<xs:element name="data" minOccurs="0" maxOccurs="unbounded"> 
    <xs:complexType> 
     <xs:group ref="dataTypesGroup" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:complexType> 
</xs:element> 

ら.. * 0としてグループのカーディナリティをcomplexType定義のグループを参照し、設定したままです。 (特にRelaxNGの構文と比較して)少し冗長ですが、XMLスキーマがはるかに良くサポートされているという点も有益です。元の問題を解決するためにRelaxNGベースのパーサーを作成しましたが、JINGのような利用可能なバリデーターは、Javaなどで出荷されるXMLスキーマベースのツールを使用するよりもかなり厄介です。

1

要素の順序を保持している場合は、XSDによってのみ実行できます(したがってxs:sequenceを使用できます)。私が意味する、常にフロート配列(もしあれば)の後に来るだろう、としてint型は常に、あなたができるだけ多くocurrecesを繰り返すことができます考慮して、フロート(もしあれば)の後に来ますあなたはそれぞれのタイプを望んでいる(または完全に省略している)。全て複合タイプは、そのコンテンツタイプ(要素、他のネストされたグループタイプ、等)のいずれかの無制限属性をサポートしていない:

理由は、XSD XSことです。他の「リラックス」スキーマでは、DTDや状態などRelaxNGなど、そうすることができます。私は前の回答が間違っているように私はこれに戻ってくるだろうと思って

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:complexType name="arrayType"> 
      <xs:sequence> 
       <xs:element name="array" type="arrayType" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element name="int" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element name="float" minOccurs="0" maxOccurs="unbounded"/> 
      </xs:sequence> 
    </xs:complexType> 
    <xs:element name="data" type="arrayType"/> 
</xs:schema> 
+0

フェルナンドさんありがとうございます。私はデータが生成される方法のために特定のシーケンスを想定することはできませんので、いくつかの選択肢を見ていきます。非常に緩やかなものを除いて要素データを検証することはできないので、私はDTDを使用したくありません。 RelaxNG *の指が交差してしまいます。 – Daniel