連載
» 2004年04月20日 10時00分 公開

XMLテクニック集(12):XML Schemaで値の有効範囲を定義する (1/3)

[山田祥寛,@IT]

XML Schemaで値の有効範囲を定義する

アイコン

数値のけた数や小数点以下のけた数、数値の範囲チェックなど、数値データに関する範囲制約を規定するには、<xsd:maxInclusive>要素、<xsd:minInclusive>要素、<xsd:maxExclusive>要素、<xsd:minExclusive>要素を利用します。

カテゴリ XML Schema
関連要素 <xsd:restriction>、<xsd:maxInclusive>、<xsd:minInclusive>
関連記事 XML Schemaで文字列長を制約する
XML Schemaで文字列パターンを定義する

 別稿「XML Schemaで文字列長を制約する」で紹介したように、<xsd:maxLength>、<xsd:minLength>、<xsd:length>などの要素を利用することで、ノード値の文字列長を規定できます。しかし、これらの要素では数値のけた数や小数点以下のけた数、数値の範囲チェックなどは行えませんので、注意が必要です。以下のように記述すると、2〜5けたの整数値を定義しているようも見えますが、これは間違いです。

<xsd:element name="price">
  <xsd:simpleType>
    <xsd:restriction base="xsd:int">
      <xsd:maxLength value="5" /> 間違い
      <xsd:minLength value="2" /> 間違い
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>


 <xsd:maxLength>要素、<xsd:minLength>要素、<xsd:length>要素による制約は、文字列、バイナリ、あるいはリストにしか適用することができません

 では、数値データに関する範囲制約を規定したい場合には、どうすればよいのでしょうか。説明の前に、具体的なサンプル例を見る方が早いでしょう。

books_maxmin.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: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">
        <xsd:simpleType>
          <xsd:restriction base="xsd:positiveInteger">
            <xsd:maxInclusive value="10000" />
            <xsd:minInclusive value="1000" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:element>

      <xsd:element name="publishDate" type="xsd:date" />
      <xsd:element name="category" type="xsd:string" />
      <xsd:element name="keywords" type="xsd:string" />
    </xsd:sequence>
    <xsd:attribute name="isbn" type="xsd:string"
      use="required" />
  </xsd:complexType>
</xsd:schema>


 上記例の場合、<price>要素のノード値を1000以上10000以下に規定します。<xsd:restriction>要素配下に、制約条件を記述する構文については、すでに別稿「XML Schemaで文字列パターンを定義する」などで紹介しているので、そちらを参照してください。

 それよりも、数値データには多くの制約条件要素が存在しますので、この種類を把握しておくのが先です。以下に、主要な制約要素を挙げてみましょう。

要素名 概要
<xsd:maxInclusive> 指定値以下であること
<xsd:minInclusive> 指定値以上であること
<xsd:maxExclusive> 指定値未満であること
<xsd:minExclusive> 指定値より大きいこと
<xsd:totalDigits> 数値データの総けた数が指定値以下であること
<xsd:fractionDigits> 小数点以下のけた数が指定値以下であること
表 数値データに関する制約条件要素

 ただし、<xsd:totalDigits>要素は精度があらかじめ規定されていない数値データに関してのみ、<xsd:fractionDigits>要素は小数点型で、かつ、精度があらかじめ規定されていない数値データに関してのみ、それぞれ使用することが可能です。

 また、<xsd:maxInclusive>要素、<xsd:minInclusive>要素、<xsd:maxExclusive>要素、<xsd:minExclusive>要素については、数値データのみならず、日付・時刻データの範囲チェックを行う場合にも使用可能です。

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


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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