連載
» 2004年01月28日 00時00分 公開

SEのためのXML Schema入門(3):複雑型を定義する定番テクニック

この連載では、XML Schemaについて解説します。簡単なXMLの構造をXML Schemaにより記述できるようになることを目標に、XML Schemaの概要、要素・属性の定義、Complex TypeやSimple Type、属性グループについて解説していきます。連載を読むに当たり、整形式のXMLに関して十分理解していることを前提とします。

[小野彩子,株式会社 四次元データ]

 前回は、複雑型の要素を宣言する方法について説明しました。今回はさらに、子要素の出現回数や出現の順番などについて、より細かく設定する方法について解説します。

maxOccurs属性

 それでは、発注データを表すXML文書のスキーマをXML Schemaで書いてみましょう。

<order>
  <orderItem>XMLマスター ラーニングブック −ベーシック−</orderItem>
  <orderItem>VB.NETによる XML Webサービス開発</orderItem>
</order>
リスト1 子要素が複数あるXML文書(発注XML1)

 この発注XML1はルート要素がorder要素のXML文書です。order要素は、子要素orderItemを持ちます。orderItem要素の内容(開始タグと終了タグの間)に発注する商品の名前を記述します。発注XML1の構造は以下のようになります。

要素名 要素の内容
order 複雑型 子要素orderItemを持つ、
orderItemは繰り返し出現する
orderItem 単純型 内容は文字列
図1 発注XML1のツリー構造 図1 発注XML1のツリー構造

 リスト1を用いて商品を発注する場合、商品は10個以下なら何個でも発注することができます。商品を同時に複数発注する場合、商品の数だけorderItem要素を追加します。同じ要素を繰り返し書く場合、XML Schemaでどのように表せばよいのでしょうか? 発注XML1のスキーマをXML Schemaで表すと、以下のようになります。

 1:<?xml version="1.0"?>
 2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 3:
 4:  <xsd:element name="order">
 5:    <xsd:complexType>
 6:      <xsd:sequence>
 7:        <xsd:element name="orderItem"
                          type="xsd:string" maxOccurs="10"/>
 8:      </xsd:sequence>
 9:    </xsd:complexType>
10:  </xsd:element>
11:
12:</xsd:schema>
リスト2 発注XML1のスキーマ定義

 同じ要素が繰り返し現れる場合は、maxOccurs属性を使用します。maxOccurs属性の値には、「要素を何個まで書くことができるか」を指定します。この例では、orderItem要素を宣言する7行目のxsd:element要素で、maxOccurs属性の値に「10」が指定されています。これは、「orderItem要素は10個以下ならいくつでも書くことができる」ことを示しています。

 なお、要素の個数に特に上限を決めない場合は、maxOccurs属性の値に「unbounded」と指定しましょう。

7:        <xsd:element name="orderItem"
                    type="xsd:string" maxOccurs="unbounded"/>

 上のように、maxOccursの値に「unbounded」を指定した場合、「orderItem要素は、1個以上何個でも記述することができる」ことを示しています。

minOccurs属性

 今度は、order要素の子要素にcomment要素を追加しましょう。

<order>
  <orderItem>XMLマスター ラーニングブック −ベーシック−</orderItem>
  <orderItem>VB.NETによる XML Webサービス開発</orderItem>
  <comment>入荷した順番に発送してください</comment>
</order>
リスト3 comment要素を追加(発注XML2)

要素名 要素の内容
order 複雑型 子要素orderItem、commentを持つ、
orderItemは繰り返し出現する、
comment要素はなくてもよい
orderItem 単純型 内容は文字列
comment 単純型 内容は文字列
図2 発注XML2のツリー構造 図2 発注XML2のツリー構造

 comment要素は、備考を表します。ただし、備考はなくても構いません。comment要素のような「なくてもよい要素」は、どのように表したらよいのでしょうか。XML Schemaは以下のようになります。

 1:<?xml version="1.0"?>
 2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 3:
 4:  <xsd:element name="order">
 5:    <xsd:complexType>
 6:      <xsd:sequence>
 7:        <xsd:element name="orderItem"
                          type="xsd:string" maxOccurs="10"/>
 8:        <xsd:element name="comment"
                          type="xsd:string" minOccurs="0"/>
 9:      </xsd:sequence>
10:    </xsd:complexType>
11:  </xsd:element>
12:
13:</xsd:schema>
リスト4 発注XML2のスキーマ定義

 8行目でxsd:element要素を使用して、comment要素を宣言しています。ここで、xsd:element要素にminOccurs属性を指定しています。minOccurs属性は、「要素を最低何回記述しなければならないか」を指定する属性です。comment要素は「書かなくてもよい」、つまり「0回以上書くことができる」ので、minOccurs属性の値に「0」を指定しています。

 このように「要素を何回書くことができるか」は、minOccurs属性やmaxOccurs属性を使用して指定できます。もちろん、minOccurs属性、maxOccurs属性を同時に指定できます。例えば、発注する商品の数が「1度に最低5個、最大10個」と制限されている場合、スキーマは以下のようになります。

 4:<xsd:element name="order">
 5:  <xsd:complexType>
 6:    <xsd:sequence>
 7:      <xsd:element name="orderItem" type="xsd:string"
              minOccurs="5" maxOccurs="10"/>
 8:      <xsd:element name="comment"
              type="xsd:string" minOccurs="0"/>
 9:   </xsd:sequence>
10:  </xsd:complexType>
11:</xsd:element>

 なお、minOccurs属性、maxOccurs属性がない場合は、「1」が指定されている場合と同じ意味になります。例えば、comment要素を宣言するelement要素には、maxOccurs属性が指定されていません。これは、以下と同じ意味になります。

15:        <xsd:element name="comment" type="xsd:string"
                 minOccurs="0" maxOccurs="1"/>

choice要素

 いままでは、orderItem要素の内容に商品の名前を記述して発注を行っていました。今度は、orderItem要素に子要素を追加し、商品の商品名か商品番号、いずれかを指定すれば発注できるようにしましょう。

<order>
  <orderItem>
    <!--商品名で発注-->
    <name>XMLマスター ラーニングブック −ベーシック−</name>
  </orderItem>
  <orderItem>
    <!--商品番号で発注-->
    <id>4-8443-1780-6</id>
  </orderItem>
</order>
リスト5 商品名か商品番号で発注する(発注XML3)

要素名 要素の内容
order 複雑型 子要素orderItemを持つ、
orderItemは繰り返し出現する
orderItem 複雑型 idまたはnameの子要素を持つ
id
name
単純型 内容は文字列
図3 発注XML3のツリー構造 図3 発注XML3のツリー構造

 このように「いずれかの要素を指定する」場合、choice要素を使用します。

 1:<?xml version="1.0"?>
 2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 3:
 4:  <xsd:element name="order">
 5:    <xsd:complexType>
 6:      <xsd:sequence>
 7:        <xsd:element ref="orderItem" maxOccurs="10"/>
 8:      </xsd:sequence>
 9:    </xsd:complexType>
10:  </xsd:element>
11:
12:  <xsd:element name="orderItem">
13:    <xsd:complexType>
14:      <xsd:choice>
15:        <xsd:element name="name" type="xsd:string"/>
16:        <xsd:element name="id" type="xsd:string"/>
17:      </xsd:choice>
18:    </xsd:complexType>
19:  </xsd:element>
20:
21:</xsd:schema>
リスト6 発注XML3のスキーマ定義

 orderItem要素の子要素はname要素、またはid要素です。そこで14行目のように、xsd:sequence要素の代わりにxsd:choice要素を使用します。xsd:choiceの内容には選択可能な要素、ここではname要素とid要素を指定します。こうして、「orderItemの子要素は、name要素かid要素」ということを表しています。

より複雑な構造を記述する

 最後にちょっと複雑なXMLのスキーマを紹介しましょう。orderItemの子要素に発注数量を表すquantityを追加します。

<order>
  <orderItem>
    <name>XMLマスター ラーニングブック −ベーシック−</name>
    <quantity>2</quantity>
  </orderItem>
  <orderItem>
    <id>4-8443-1780-6</id>
  </orderItem>
</order>
リスト7 より複雑なXML文書(発注XML4)

要素名 要素の内容
order 複雑型 子要素orderItemを持つ
orderItem 複雑型 idまたはname、およびquantityの子要素を持つ
id
name
quantity
単純型 内容は文字列
図4 発注XML4のツリー構造 図4 発注XML4のツリー構造

 quantity要素はname要素またはid要素の後に記述します。また、quantity要素は記述しなくても構いません。quantityの記述がない場合は商品を1つ発注したことになります。orderItem要素のデータ型は複雑ですが、xsd:sequence要素とxsd:choice要素を使用して以下のように記述することができます。

 1:<?xml version="1.0"?>
 2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 3:
 4:  <xsd:element name="order">
 5:    <xsd:complexType>
 6:      <xsd:sequence>
 7:        <xsd:element ref="orderItem" maxOccurs="10"/>
 8:      </xsd:sequence>
 9:    </xsd:complexType>
10:  </xsd:element>
11:
12:  <xsd:element name="orderItem">
13:    <xsd:complexType>
14:      <xsd:sequence>
15:        <xsd:choice>
16:          <xsd:element name="name" type="xsd:string"/>
17:          <xsd:element name="id" type="xsd:string"/>
18:        </xsd:choice>
19:        <xsd:element name="quantity" type="xsd:string"
                          minOccurs="0"/>
20:      </xsd:sequence>
21:    </xsd:complexType>
22:  </xsd:element>
23:
24:</xsd:schema>
リスト8 発注XML4のスキーマ定義

 orderItem要素の子要素は「最初はname要素、またはid要素。2番目はquantity要素」と、順番が決まっています。よって、xsd:complexType要素の子要素にはxsd:sequenceを使用します。

 次に、orderItem要素の最初の子要素は、name要素かid要素のうち、どちらかを選択します。よって、15行目のようにxsd:choice要素の内容にname要素とid要素を指定します。このように、xsd:sequence要素の内容にxsd:choice要素を指定することができるのです。

 choice要素の次に、quantity要素を宣言します。quantity要素は「なくても構わない要素」なので、minOccurs属性を指定し、値を「0」にします。

 そのほかにもxsd:choice要素の子要素としてxsd:sequenceを記述したり、xsd:choice要素にminOccurs、maxOccurs属性を指定することも可能です。xsd:sequence要素やxsd:choice要素、minOccurs属性、maxOccurs属性を駆使すれば、いろいろな複雑型の構造を表現できます。


 今回で複雑型についての解説は終わりです。次回は、XML Schemaで豊富に用意されている単純型のデータ型について解説します。(次回に続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。