要素はタイプ「文字列のリスト」を持つ必要があり、0
以上の種類の情報の出現。だから私がしたことは:
<xs:element name="xxx" type="ooo" />
<xs:simpleType name="ooo">
<xs:list itemType="xs:string" />
</xs:simpleType>
これは正しいと思いますが、
ここにminOccur
とmaxOccur
をどこに置くのですか?
質問は複数のことを意味する可能性があるため、残念ながら不明確です。
考えられる解釈の1つは、要素 "xxx"を0〜x回発生させることです。これは、ルート要素内でシーケンスを定義することによって行われます。
<xs:simpleType name="ooo">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="xxx" type="ooo" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
XMLにはルート要素が1つしかないため、ルート要素にminOccursとmaxOccursを指定することはできません。しかし、ルート要素の子としてシーケンスを定義できます。これは、上記の例で行われていることです。
「xxx」をルート要素にしたい場合は、まったく同じことを効果的に行うことができます。これはまったく同じですが、「root」という要素の代わりに「xxx」という要素があり、子要素は「ooo」というタイプの別の要素と呼ばれます
<xs:simpleType name="ooo">
<xs:restriction base="xs:string" />
</xs:simpleType>
<xs:element name="xxx">
<xs:complexType>
<xs:sequence>
<xs:element name="xxx-child" type="ooo" maxOccurs="unbounded" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
あなたの例では、「リスト」タイプの使用は、あなたがそれが意味すると思うことを意味します。 XSDのリストタイプは要素のシーケンスを定義しませんが、スペースで区切られた値のリストを持つことができる単一の要素です。
<xs:simpleType name="ooo">
<xs:list itemType="xs:string" />
</xs:simpleType>
<xs:element name="xxx" type="ooo" />
このスキーマ定義の結果のXMLは次のようになります。
<xxx>item1 item2 item3 item4 item5</xxx>
XMLは事実上、スペースで区切られた任意の長さの文字列の無制限のリストです。 xs:string
から継承するリストのタイプを定義して、値のタイプを制限することもできますが、長さを制限する方法は知りません。
そして最後に、あなたが達成しようとしていることは、「xxx」と「xxx-child」を使用した上記の提案の1つに近いですが、シーケンスが定義されている場所を再フォーマットするだけです。
<xs:complexType name="ooo">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="child" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="xxx" type="ooo" />
結果のXMLは次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<xxx>
<child></child>
<child></child>
<child></child>
</xxx>
また、最後のオプションには、minOccurs="0" maxOccurs="unbounded"
を<xs:sequence>
から「子」要素に移動するなどのバリエーションがあります。あなたの例では、両方の定義がまったく同じXMLになるため、それはまったく問題になりません。しかし、2つの子要素がある場合、それは異なる意味になります。
<xs:complexType name="ooo">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="child1" type="xs:string" />
<xs:element name="child2" type="xs:string" />
</xs:sequence>
</xs:complexType>
次のようなXMLになります(child1の後にchild2が続くシーケンスがx回繰り返されます)。
<?xml version="1.0" encoding="utf-8"?>
<xxx>
<child1></child1>
<child2></child2>
<child1></child1>
<child2></child2>
<child1></child1>
<child2></child2>
</xxx>
どこに
<xs:complexType name="ooo">
<xs:sequence>
<xs:element name="child1" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="child2" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
結果は次のようなXMLになります(child1はx回繰り返され、child2はy回繰り返されます):
<?xml version="1.0" encoding="utf-8"?>
<xxx>
<child1></child1>
<child1></child1>
<child2></child2>
<child2></child2>
<child2></child2>
<child2></child2>
<child2></child2>
</xxx>
文字列のリストを持つフィールドを持つオブジェクトを取得しないようにするには、より簡単な方法を使用できます。
<xs:complexType>
<xs:sequence>
<xs:element name="stringList" block="extension"
minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
</xs:sequence>
</xs:complexType>
次に、生成されたクラスでは、フィールド(オブジェクトではなく)を直接含むフィールドを取得します
List<String> stringList;