連載
» 2004年03月17日 10時00分 公開

XMLテクニック集(11):XML Schemaで一意キーとなる要素・属性を定義する (3/3)

[山田祥寛,@IT]
前のページへ 1|2|3       

XML Schemaで文字列長を制約する

アイコン

要素ノードに対して、文字列長の制約条件を定義できます。文字列の最大長は<xsd:maxLength>要素、最小長は<xsd:minLength>要素、特定の文字数を規定するなら<xsd:length>要素を使用します。

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

 スキーマにおいて、文字列長を規定することは大変重要なことです。というのも、XML文書としてやりとりされたデータを、いざ自分のシステムなりデータベースなりに格納しようとしても、文字列長が規定されたフィールド長を超えていたら、そもそもデータベースに格納すらできません。

 別稿「XML Schemaで文字列パターンを定義する」でも紹介した正規表現チェック(<xsd:pattern>)がむしろ高レベルなデータのセマンティックな妥当性を保証するものだとするならば、文字列長などのチェックはより低レベル(基本的な)データの最低限の妥当性を保証する規定といえます。

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

books_length.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">
        <xsd:simpleType>
          <xsd:restriction base="xsd:string">
            <xsd:maxLength value="30" />
            <xsd:minLength value="5" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:element>

      <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" type="xsd:string" />
    </xsd:sequence>
    <xsd:attribute name="isbn" type="xsd:string"
        use="required" />
  </xsd:complexType>
</xsd:schema>


 要素ノードに対して、文字列長の制約条件を定義する一般的な構文は、以下のとおりです。

<xsd:element name="要素名" そのほかのオプション>
  <xsd:simpleType>
    <xsd:restriction base="xsd:string">
      <xsd:maxLength value="最大長" />
      <xsd:minLength value="最小長" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>


 <xsd:maxLength>、<xsd:minLength>要素は、それぞれ文字列の最大長、最小長を規定します。最大長のみ(あるいは、最小長のみ)を規定したいなら、<xsd:maxLength>、<xsd:minLength>要素のいずれかを指定します。○〜○文字の間という範囲ではなく、○文字と特定の文字数を規定したい場合には(例えば、特定のコード番号のようなデータの場合です)、<xsd:length>要素を使用します。<xsd:maxLength>と<xsd:length>要素とは混同しやすいので、注意してください。

 XML Schemaでは、要素内容の必須チェックを行うことはできませんが(要素記述の有無は検証できますが、文字列型のデータが空文字列でもエラーとはなりません)、<xsd:minLength>要素を1に指定することで、疑似的な必須チェックを実現できます。

 なお、ここでは元となるデータ型が文字列(string)であることを前提にしていますが、元のデータ型がリストである場合、<xsd:maxLength>、<xsd:minLength>、<xsd:length>要素は異なる挙動をしますので、注意してください(詳細については、別稿「XML Schemaで値リストの個数を制限する」を参照)。

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


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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