XMLファイルのXMLスキーマを書きたい:
<root>
<rate>10</rate>
<rate></rate>
<rate>15</rate>
...
</root>
<rate> minOccursは1で、maxOccursは無制限です。<rate>はxs:integerタイプである必要がありますが、<rate> </ rate>はどうすればよいですか?<rate xsi:nil ="true"/>とは書きたくありません。
<rate>
コンテンツのある要素とコンテンツのない要素ではなく、コンテンツとして整数値または何も受け入れない要素をxs:integer
1つだけ宣言できます。<rate>
<xs:union>
実際には、これは次の要素を使用して実行できます。
<xs:simpleType name="emptyString">
<xs:restriction base="xs:string">
<xs:maxLength value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="rate">
<xs:simpleType>
<xs:union memberTypes="xs:integer emptyString"/>
</xs:simpleType>
</xs:element>
これは、、、(またはその他の値)を受け入れますが、は受け入れませ<rate/>
ん。<rate></rate>
<rate>42</rate>
xs:integer
<rate>Hello, World!</rate>
これを機能させるには、スキーマ内のプレフィックスなしの名前空間をターゲット名前空間と同じに設定する必要があります。そうemptyString
しないと、memberTypes
属性が見つかりません。(もちろん、代わりにターゲット名前空間のプレフィックスを定義してそれを使用することもできます。)
完全なスキーマの書き方や使い方maxOccurs
などの説明は省略しました。あなたの質問から、あなたはすでにそれを行う方法を知っていると思います。これについてさらに情報が必要な場合はお知らせください。
ORMapperのアプローチの代わりに、要素の型をmaxLength=1の整数のリストとして宣言することもできます。
<xs:element name="rate">
<xs:simpleType>
<xs:restriction base="listOfInteger">
<xs:maxLength value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:simpleType name="listOfInteger">
<xs:list itemType="xs:integer"/>
</xs:simpleType>
スキーマ対応のXQueryおよびXSLTアプリケーションで処理する方が簡単なので、(整数、長さゼロの文字列)の和集合を使用するよりもこのアプローチを好む傾向があります。JAXBを使用したデータバインディングを使用している場合にも、うまくいく可能性があります。わかりません。
使用する予定のXMLスキーマを記述します。C ++コードジェネレーターを使用するので、これにより作業がはるかに簡単になります(私は、EclipseLink JAXB(MOXy)のリーダーなので、Java側でこれを使用した経験があります)。
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="rate" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
無効なデータを受け取ることが予想されるため、次のオプションがあります。
ValidationEventHandler
メカニズムを提供します。