連載
» 2003年11月12日 10時00分 公開

XMLテクニック集(7):XML Schemaで単純型要素を定義する (2/3)

[山田祥寛,@IT]

XML Schemaで複雑型要素を定義する

アイコン

XMLデータの構文ルールを記述するXML Schemaでは、要素の配下にテキストデータ以外にも子要素を持つ場合、「複雑型要素」を使います。子要素の順序や登場回数を記述する方法を解説します。

カテゴリ XML Schema
関連要素 <xsd:complexType>、<xsd:sequence>
関連記事 XML Schemaで単純型要素を定義する

 XML Schemaにおいては、要素型を「配下にテキストしか持たない」か「子要素や属性を持つか」によって区別します。前者を単純型要素(Simple Type)、後者を複雑型要素(Complex Type)といいます。

 これはただ単に「概念」の違いだけではなく、構文においても違いがあります。

複雑型要素(Complex Type)の記法

 くどくど説明するよりも、まずは具体的な例を見てみましょう。以下は、ルート要素<books>の配下に複数の<book>要素を持ち、さらにその配下に個々の書籍属性を表す複数の子要素から構成されるbook.xmlとそのスキーマデータのbook.xsdです。

[book.xml]

<?xml version="1.0" encoding="Shift_JIS" ?>
<books>
  <book>
    <title>10日でおぼえるJSP/サーブレット入門教室</title>
    <author>Y.Yamada</author>
    <published>翔泳社</published>
    <price>2800</price>
    <publishDate>2002/05/17</publishDate>
  </book>
  <book>
    <title>JSP/PHP/ASPサーバサイドプログラミング徹底比較</title>
    <author>Y.Yamada</author>
    <published>技術評論社</published>
    <price>2880</price>
    <publishDate>2002/12/16</publishDate>
  </book>
  ……中略……
</books>

[book.xsd]

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="books">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="book" type="book_type"
          minOccurs="0" maxOccurs="unbounded" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="book_type">
    <xsd:sequence>
      <xsd:element name="title" type="xsd:string" />
      <xsd:element name="author" type="xsd:string" />
      <xsd:element name="published" type="xsd:string" />
      <xsd:element name="price" type="xsd:positiveInteger" />
      <xsd:element name="publishDate" type="xsd:date" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>


 要素配下に要素(もしくは属性)を含む場合には、<xsd:element>要素配下に<xsd:complexType>要素を記述します。<xsd:complexType>要素は子要素や属性の情報、また、その登場順や回数を定義します。

要素の順序に制約を加える

 <xsd:complexType>要素の<xsd:sequence>要素は、その配下の要素(<xsd:element>)が順番に登場することを意味します。例えば、下記のようなXML Schemaであれば、<title>、<author>、<published>、<price>、<publishDate>要素が順番に記述されなければなりません。

<xsd:sequence>
  <xsd:element name="title" type="xsd:string" />
  <xsd:element name="author" type="xsd:string" />
  <xsd:element name="published" type="xsd:string" />
  <xsd:element name="price" type="xsd:positiveInteger" />
  <xsd:element name="publishDate" type="xsd:date" />
</xsd:sequence>


登場回数の制約とカスタム要素型参照

 また、<xsd:element>要素では要素の登場回数カスタムの要素型を参照することができる点に注目してください。以下の部分がそれです。

<xsd:sequence>
  <xsd:element name="book" type="book_type"
    minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>


 minOccurs属性は最小登場回数を、maxOccures属性は最大登場回数を表します。つまり、minOccures属性が0の場合はその要素が任意(登場しなくてもよい)であることを表しますし、1以上の場合には必須であることを示します。maxOccurs属性はminOccurs属性よりも等しいか大きくなければなりませんが、等しい場合、指定要素はきっちり指定回数だけ登場しなければならないことを意味します。もしも0回以上、1回以上というように上限を設けたくない場合には、特殊な値としてmaxOccures属性に“unbounded”を指定します。

 上記のtype属性は参照する要素型を表します。この場合、

<xsd:complexType name="book_type">


に対応します。つまり、<xsd:complexType>要素によって定義しておいたデータ型(子要素の並び順や個々のデータ型)を、<xsd:element>要素は引用することができるというわけです。このような参照の機能によって、XML Schemaでは、同様の構成を持つ複雑型要素を簡潔に定義することが可能となります。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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