検索
連載

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

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

PC用表示 関連情報
Share
Tweet
LINE
Hatena

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

maxOccurs属性

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

minOccurs属性

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

choice要素

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

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

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

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 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.

ページトップに戻る