2.5. 複雑なデータ型の定義
概要
XML スキーマは、単純なデータ型から複雑なデータ構造を構築するための柔軟で強力なメカニズムを提供します。要素と属性のシーケンスを作成することにより、データ構造を作成できます。定義した型を拡張して、さらに複雑な型を作成することもできます。
複雑なデータ構造を構築することに加えて、列挙型、特定の範囲の値を持つデータ型、またはプリミティブ型を拡張または制限することによって特定のパターンに従う必要があるデータ型などの特殊な型を記述することもできます。
2.5.1. データ構造の定義
概要
XML スキーマでは、データフィールドのコレクションであるデータユニットは、complexType 要素を使用して定義されます。複合型を指定するには、次の 3 つの情報が必要です。
-
定義された型の名前は
complexType要素のname属性に指定されます。 -
complexTypeの最初の子要素は、それがネットワークに配置される際の構造のフィールドの動作を記述します。「複合型の種類」を参照してください。 -
定義された構造の各フィールドは、
complexType要素の孫であるelement要素で定義されます。「構造の部分を定義」 を参照してください。
たとえば、例2.3「簡易構造」 は、XML スキーマで 2 つの要素を持つ複合型として定義されています。
例2.3 簡易構造
struct personalInfo
{
string name;
int age;
};
例2.4「複合型」 は、例2.3「簡易構造」 に記載されている構造の可能な XML スキーママッピングの 1 つを表しています。例2.4「複合型」 で定義された構造によって、name および age の 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 複合型記述子要素
例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 以外に、element 要素には、minOcurrs と maxOccurs の 2 つの一般的に使用される任意の属性があります。これらの属性は、構造内でフィールドが発生する回数に制限を設けます。デフォルトでは、各フィールドは複合型で 1 回だけ発生します。これらの属性を使用して、フィールドが構造体に表示される必要がある回数、または表示される回数を変更できます。たとえば、例2.6「発生制約のある簡易複合型」 に示されているように、previousJobs というフィールドを定義できます。これは 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 がゼロに設定された単純な複合型」 で示すように、minOccurs をゼロに設定することにより、minOccurs を使用して age フィールドを任意にすることもできます。この場合、age は省略できますが、データは引き続き有効となります。
例2.7 minOccurs がゼロに設定された単純な複合型
<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 要素は、all、sequence、または 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 要素には以下の属性があります。
attribute 要素では、任意の default 属性を指定できます。これにより、属性のデフォルト値を指定できます。