Menu Close

2.5. 複合データ型の定義

概要

XML スキーマは、単純データ型から複合データ構造を構築する、柔軟で強力なメカニズムを提供します。要素および属性のシーケンスを作成して、データ構造を作成できます。また、定義された型を拡張して、さらに複雑な複合型を作成することもできます。

複合データ構造を構築する他に、列挙型、特定の値の範囲を持つデータ型、プリミティブ型の拡張または制限を行って、特定のパターンに従ったデータ型などの特殊型を記述することもできます。

2.5.1. データ構造の定義

概要

XML スキーマでは、データフィールドのコレクションであるデータ型は、complexType 要素を使用して定義されます。複合型を指定するには、以下の 3 つの情報が必要です。

  1. 定義された型の名前は、complexType 要素の name 属性で指定されます。
  2. complexType の最初の子要素は、それが ネットワークに配置される際の構造のフィールドの動作を記述します。「複合型の差異」 を参照してください。
  3. 定義された構造の各フィールドは、complexType 要素の孫である element 要素で定義されます。「構造の一部の定義」 を参照してください。

たとえば、例2.3「単純構造」 の構造は、XML スキーマでは、2 つの要素を持つ複合型として定義されています。

例2.3 単純構造

struct personalInfo
{
  string name;
  int age;
};

例2.4「複合型」 は、例2.3「単純構造」 に記載されている構造の可能な XML スキーママッピングの 1 つを表しています。例2.4「複合型」 で定義された構造によって、nameage の 2 つの要素が含まれるメッセージが生成されます。

.

例2.4 複合型

<complexType name="personalInfo">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="age" type="xsd:int" />
  </sequence>
</complexType>

複合型の差異

XML スキーマには、XML ドキュメントとして表現され、ワイヤで渡される場合に複合型のフィールドがどのように編成されているかを記述する3つの方法があります。complexType 要素の最初の子要素は、どの複合型が使用されるかを判断します。表2.1「複合型記述子要素」 は、複合型の動作を定義するために使用される要素を示しています。

表2.1 複合型記述子要素

要素複合型の動作

sequence

複合型のフィールドはすべて存在し、型定義で指定されている順序である必要があります。

all

複合型のフィールドはすべて存在しますが、任意の順序にすることができます。

choice

構造内の要素の 1 つのみをメッセージに配置できます。

例2.5「単純複合 choice 型」 に示されるように choice 要素を使用して構造が定義されている場合には、name 要素または age 要素でメッセージを生成します。

例2.5 単純複合 choice 型

<complexType name="personalInfo">
  <choice>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int"/>
  </choice>
</complexType>

構造の一部の定義

element 要素を使用して構造を構成するデータフィールドを定義します。すべての complexType 要素には、少なくとも 1 つの element 要素が含まれている必要があります。complexType 要素の各 element 要素は、定義されたデータ構造のフィールドを表します。

データ構造のフィールドを完全に説明するために、element 要素には 2 つの必須属性があります。

  • name 属性はデータフィールドの名前を指定し、定義された複合型内で一意である必要があります。
  • type 属性は、フィールドに保存されたデータの型を指定します。型は、XML スキーマの単純型の 1 つか、またはコントラクトで定義されている任意の名前付き複合型のいずれかになります。

name および type に加え、element 要素には、minOcurrsmaxOccurs の一般的に使用される 2 つのオプション属性があります。これらの属性は、構造でフィールドが発生する回数に制限を設けます。デフォルトでは、各フィールドは複合型で 1 回だけ発生します。これらの属性を使用して、構造でフィールドが発生する必要がある回数または発生できる回数を変更できます。たとえば、previousJobs に示されているように、例2.6「発生の制約がある単純複合型」 というフィールドを定義できます。これは 3 回以上、7 回以下発生します。

例2.6 発生の制約がある単純複合型

<complexType name="personalInfo">
  <all>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int"/>
    <element name="previousJobs" type="xsd:string:
             minOccurs="3" maxOccurs="7"/>
  </all>
</complexType>

例2.7「minOccurs が 0 に設定されている単純複合型」 に記載のとおり minOccurs をゼロに設定し、minOccurs を使用して age フィールドをオプションにすることもできます。この場合、age は省略でき、データは引き続き有効です。

例2.7 minOccurs が 0 に設定されている単純複合型

<complexType name="personalInfo">
  <choice>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int" minOccurs="0"/>
  </choice>
</complexType>

属性の定義

XML ドキュメントでは、属性は要素のタグに含まれます。たとえば、以下のコードの complexType 要素では name が属性になります。複合型の属性を指定するには、complexType 要素定義で attribute 要素を定義します。attribute 要素は、allsequence、または choice 要素の後でのみ使用できます。複合型の属性ごとに attribute 要素を 1 つ指定します。attribute 要素は complexType 要素の直接の子でなければなりません。

例2.8 属性のある複合型

<complexType name="personalInfo">
  <all>
    <element name="name" type="xsd:string"/>
    <element name="previousJobs" type="xsd:string"
             minOccurs="3" maxOccurs="7"/>
  </all>
  <attribute name="age" type="xsd:int" use="required" />
</complexType>

前述のコードでは、attribute 要素は personalInfo 複合型に age 属性があることを指定します。attribute 要素には以下の属性があります。

  • name - 属性を識別する文字列を指定する必須属性。
  • type - フィールドに保存されたデータの型を指定します。型は、XML スキーマの単純型のいずれかになります。
  • use - 複合型にこの属性が必要であるかを指定する任意の属性。有効な値は required または optional です。デフォルトではこの属性は任意です。

attribute 要素では、オプションの default 属性を指定でき、これにより、属性のデフォルト値を指定できます。