複雑型を定義する定番テクニック:SEのためのXML Schema入門(3)
この連載では、XML Schemaについて解説します。簡単なXMLの構造をXML Schemaにより記述できるようになることを目標に、XML Schemaの概要、要素・属性の定義、Complex TypeやSimple Type、属性グループについて解説していきます。連載を読むに当たり、整形式のXMLに関して十分理解していることを前提とします。
前回は、複雑型の要素を宣言する方法について説明しました。今回はさらに、子要素の出現回数や出現の順番などについて、より細かく設定する方法について解説します。
maxOccurs属性
それでは、発注データを表すXML文書のスキーマをXML Schemaで書いてみましょう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
この発注XML1はルート要素がorder要素のXML文書です。order要素は、子要素orderItemを持ちます。orderItem要素の内容(開始タグと終了タグの間)に発注する商品の名前を記述します。発注XML1の構造は以下のようになります。
要素名 | 型 | 要素の内容 |
---|---|---|
order | 複雑型 | 子要素orderItemを持つ、 orderItemは繰り返し出現する |
orderItem | 単純型 | 内容は文字列 |
リスト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 | 単純型 | 内容は文字列 |
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 |
単純型 | 内容は文字列 |
このように「いずれかの要素を指定する」場合、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 |
単純型 | 内容は文字列 |
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.