web-dev-qa-db-ja.com

XMLスキーマ-文字列のリスト

要素はタイプ「文字列のリスト」を持つ必要があり、0以上の種類の情報の出現。だから私がしたことは:

<xs:element name="xxx" type="ooo" />

<xs:simpleType name="ooo">
   <xs:list itemType="xs:string" />
</xs:simpleType>

これは正しいと思いますが、

ここにminOccurmaxOccurをどこに置くのですか?

12
Jane Doe

質問は複数のことを意味する可能性があるため、残念ながら不明確です。

考えられる解釈の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>
26
psubsee2003

文字列のリストを持つフィールドを持つオブジェクトを取得しないようにするには、より簡単な方法を使用できます。

<xs:complexType>
    <xs:sequence>
        <xs:element name="stringList" block="extension"
            minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

次に、生成されたクラスでは、フィールド(オブジェクトではなく)を直接含むフィールドを取得します

List<String> stringList;
1
Drakonoved