連載
» 2004年02月11日 10時00分 公開

XMLテクニック集(10):XML Schemaで選択型の値を定義する (2/3)

[山田祥寛,@IT]

XML Schemaで値リストの個数を制限する

アイコン

スペース区切りのリスト値に対してデータ型とデータ個数の制限を定義するには、<xsd:list>要素と<xsd:restriction>要素を使い2段階に分けて設定し、制約には<xsd:maxLength>要素などを指定します。

カテゴリ XML Schema
関連要素 <xsd:restriction>、<xsd:list>、<xsd:maxLength>
関連記事 XML Schemaで文字列パターンを定義する
XML Schemaで選択型の値を定義する

 XML文書では、以下のようにスペース区切りのリスト値を記述することができます。例えば、以下のようにです。

<keywords>JSP サーブレット Tomcat J2SE</keywords>


 これによって、XML文書は不特定個数の列挙値をコンパクトに記述する術を提供しているというわけです。XML Schemaはこうしたリスト値に対しても、リストに含むことができるデータ型とデータ個数の制限を定義することが可能です。

 以下に、具体的な例を見てみましょう、なお、対象となるXML文書については、別稿「XML Schemaで文字列パターンを定義する」で用いたbook.xmlを使用します。

books_list.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:attribute name="name" type="xsd:string"
          use="required" />
    </xsd:complexType>
  </xsd:element>
  <xsd:simpleType name="keywords_type">
    <xsd:list itemType="xsd:string" />
  </xsd:simpleType>

  <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:element name="category" type="xsd:string" />
      <xsd:element name="keywords">
        <xsd:simpleType>
          <xsd:restriction base="keywords_type">
            <xsd:maxLength value="5" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:element>

    </xsd:sequence>
    <xsd:attribute name="isbn" type="xsd:string" use="required" />
  </xsd:complexType>
</xsd:schema>


 リスト値のデータ型と個数の制約を指定するには、以下の2段階のステップを踏む必要があります。

(1)リストのデータ型を定義する

 まずは、ノード値がリスト構成となっていること、かつ、リストに含まれるデータの型を単純型として定義していることです。これを規定しているのが、以下の部分です。

<xsd:simpleType name="keywords_type">
  <xsd:list itemType="xsd:string" />
</xsd:simpleType>


 <xsd:list>要素は、データ値が「itemType属性で指定されたデータ型のリスト」であることを規定します。この場合、文字列型データのリストを定義しています。

(2)リストそのものの制約を定義する

 (1)で定義されたリスト型に対して、さらに制約条件を規定しているのが以下の部分です。

<xsd:element name="keywords">
  <xsd:simpleType>
    <xsd:restriction base="keywords_type">
      <xsd:maxLength value="5" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>


 すでに定義された単純型“keywords_type”をベースとして、さらに制約を設けているわけです。ここでは、<xsd:maxLength>要素で「リストに含むことができるデータの個数」を定義しています(リストに含まれる個々の文字列データの最大長ではない点に注意してください。その場合は、一度、文字列長を規定された文字列型を定義しておき、それを元にしてリスト型を生成する必要があります)。リストに含まれる個数が指定値5を超えた場合に、パーサ検証はエラーとなります。

 ちなみに、リスト型に対する制約は、ほかにも

  • <xsd:enumeration>(リスト値に含むことができる列挙値)
  • <xsd:length>(リストの個数)
  • <xsd:minLength>(リストの個数最小値)
  • <xsd:pattern>(リスト値個々の正規表現パターン)

などがあります。<xsd:length>、<xsd:minLength>要素については、<xsd:maxLength>要素同様、リストに含まれる個数(サイズ)の制約である点に注意してください。<xsd:enumeration>、<xsd:pattern>要素については、別稿「XML Schemaで文字列パターンを定義する」「XML Schemaで選択型の値を定義する」をそれぞれ参照してください。

実際に、妥当性検証を行いたい場合には、別稿「XML SchemaでXML文書の妥当性を検証する」のサンプルを参考にするとよいでしょう。変更個所は、XMLSchemaCache.addメソッドの第2引数(XML Schemaのファイル名)のみです。スキーマ文書を書いてみるだけでは、スキーマ文書そのものの妥当性を判断できませんが、パーサの処理を介することでスキーマの正否を確認できます。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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