Schemaについて解説します。Type、属性グループについて解説していきます。連載を読むに当たり、整形式のXMLに関して十分理解していることを前提とします。});前回は、複雑型の要素を宣言する方法について説明しました。今回はさらに、子要素の出現回数や出現の順番などについて、より細かく設定する方法について解説します。Schemaで書いてみましょう。子要素が複数あるXML文書(発注XML1)この発注XML1はルート要素がorder要素のXML文書です。order要素は、子要素orderItemを持ちます。orderItem要素の内容(開始タグと終了タグの間)に発注する商品の名前を記述します。発注XML1の構造は以下のようになります。発注XML1のツリー構造リスト1を用いて商品を発注する場合、商品は10個以下なら何個でも発注することができます。商品を同時に複数発注する場合、商品の数だけorderItem要素を追加します。Schemaで表すと、以下のようになります。同じ要素が繰り返し現れる場合は、maxOccurs属性を使用します。maxOccurs属性の値には、「要素を何個まで書くことができるか」を指定します。この例では、orderItem要素を宣言する7行目のxsd:element要素で、maxOccurs属性の値に「10」が指定されています。これは、「orderItem要素は10個以下ならいくつでも書くことができる」ことを示しています。要素の個数に特に上限を決めない場合は、maxOccurs属性の値に「unbounded」と指定しましょう。maxOccurs="unbounded"/>上のように、maxOccursの値に「unbounded」を指定した場合、「orderItem要素は、1個以上何個でも記述することができる」ことを示しています。今度は、order要素の子要素にcomment要素を追加しましょう。発注XML2のツリー構造comment要素は、備考を表します。備考はなくても構いません。comment要素のような「なくてもよい要素」は、どのように表したらよいのでしょうか。Schemaは以下のようになります。発注XML2のスキーマ定義8行目でxsd:element要素を使用して、comment要素を宣言しています。ここで、xsd:element要素にminOccurs属性を指定しています。minOccurs属性は、「要素を最低何回記述しなければならないか」を指定する属性です。comment要素は「書かなくてもよい」、つまり「0回以上書くことができる」ので、minOccurs属性の値に「0」を指定しています。このように「要素を何回書くことができるか」は、minOccurs属性やmaxOccurs属性を使用して指定できます。minOccurs属性、maxOccurs属性を同時に指定できます。発注する商品の数が「1度に最低5個、最大10個」と制限されている場合、スキーマは以下のようになります。</xsd:complexType>11:</xsd:element>なお、minOccurs属性、maxOccurs属性がない場合は、「1」が指定されている場合と同じ意味になります。comment要素を宣言するelement要素には、maxOccurs属性が指定されていません。これは、以下と同じ意味になります。maxOccurs="1"/>choice要素いままでは、orderItem要素の内容に商品の名前を記述して発注を行っていました。今度は、orderItem要素に子要素を追加し、商品の商品名か商品番号、いずれかを指定すれば発注できるようにしましょう。発注XML3のツリー構造このように「いずれかの要素を指定する」場合、choice要素を使用します。発注XML3のスキーマ定義orderItem要素の子要素はname要素、またはid要素です。そこで14行目のように、xsd:sequence要素の代わりにxsd:choice要素を使用します。xsd:choiceの内容には選択可能な要素、ここではname要素とid要素を指定します。して、「orderItemの子要素は、name要素かid要素」ということを表しています。複雑な構造を記述する最後にちょっと複雑なXMLのスキーマを紹介しましょう。orderItemの子要素に発注数量を表すquantityを追加します。発注XML4のツリー構造quantity要素はname要素またはid要素の後に記述します。quantity要素は記述しなくても構いません。quantityの記述がない場合は商品を1つ発注したことになります。orderItem要素のデータ型は複雑ですが、xsd:sequence要素とxsd:choice要素を使用して以下のように記述することができます。発注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属性を駆使すれば、いろいろな複雑型の構造を表現できます。今回で複雑型についての解説は終わりです。Schemaで豊富に用意されている単純型のデータ型について解説します。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。