連載
» 2004年01月14日 10時00分 公開

XMLテクニック集(9):XML Schemaで文字列パターンを定義する (1/3)

[山田祥寛,@IT]

XML Schemaで文字列パターンを定義する

アイコン

XML Schemaを利用してXML文書の妥当性をチェックする際に、正規表現を使って特定のパターン文字列を検証できます。電話番号やメールアドレスなどの入力チェックなどに活用できるでしょう。

カテゴリ XMLSchema
関連要素 <xsd:restriction>、<xsd:pattern>
関連記事 XML Schemaで複雑型要素を定義する

 別稿「XML Schemaで複雑型要素を定義する」でも紹介したように、カスタムの要素型を定義することで、XML文書内で使用できる要素や属性ノード、そして、それらの登場順や登場回数などを指定できます。

 しかし、これらはあくまでXML Schemaのごく表面的な機能にすぎません。XML Schemaの本当の魅力とは、カスタムの要素型を定義することであらかじめ用意されている基本データ型を拡張し、個々の用途にマッチした制約条件(拡張されたデータ型、といってもよいかもしれません)を定義できる点にあります。

 本稿では、XML Schemaがサポートするさまざまな制約条件の中から正規表現を利用して、特定のパターンを持つ文字列データの検証を行うことにします。特定のパターンとは、E-MailアドレスやURL文字列、郵便番号、電話番号のようなある体系の範囲内で記述される文字列をいいます。例えば、郵便番号であれば、「3けたの数値」+「-」+「4けたの数値」で表されます。通常、これら文字列の妥当性を検証することは面倒でしたが、正規表現を用いれば非常にシンプルにコーディングできます。

 語弊を承知でいうならば、正規表現とはWindowsのファイル検索で用いる「*.xml」――ワイルドカードの発展形と思えばよいでしょう。「*」は0文字以上の任意の文字を表し、「sample.xml」や「.xml」などの文字列にマッチングします。正規表現ではより多彩な記述子を提供することで、ワイルドカードとは比べものにならない表現力を提供します。

 それでは、実際に正規表現チェックの定義を見てみましょう。ここでは、ISBNコード(書籍を一意に表すコード)の体系を正規表現パターンで表現することにします。

books.xml

<?xml version="1.0" encoding="Shift_JIS" ?>
<atit:books xmlns:atit="urn:bookList" name="書籍情報一覧">
  <book isbn="ISBN4-7981-0189-3">
    <title>10日でおぼえるJSP/サーブレット入門教室</title>
    <author>Y.Yamada</author>
    <published>翔泳社</published>
    <price>2800</price>
    <publishDate>2002-05-17</publishDate>
    <category>JSP&サーブレット</category>
    <keywords>JSP サーブレット Tomcat J2SE</keywords>
  </book>
  ……中略……
</atit:books>

books_regexp.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" 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" use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:pattern
            value="ISBN[0-9]{1}-[0-9]{3,5}-[0-9]{4}-[0-9A-Z]{1}" />
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

  </xsd:complexType>
</xsd:schema>


 属性ノードに対して正規表現による制約条件を定義する一般的な構文は、以下のとおりです。

<xsd:attribute name="属性名" そのほかのオプション>
  <xsd:simpleType>
    <xsd:restriction base="基本となるデータ型">
      <xsd:pattern value="正規表現パターン" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:attribute>


 要素ノードに対して制約条件を定義する場合には、<xsd:attribute>を<xsd:element>に変更するだけです。

 <xsd:restriction>要素配下には、正規表現(<xsd:pattern>要素)のほかにも数値の値範囲、文字列長、リスト制約など、さまざまな制約条件を定義できますが(複合的に用いることも可能)、それらについては、以降の記事で順に紹介していきます。

 取りあえず、ここでは正規表現チェック(検証)を定義するのが、<xsd:pattern>要素の役割であると覚えましょう。isbn属性は、仮に「ISBN」+「数値1けた」+「-」+「数値3〜5けた」+「-」+「数値4けた」+「-」+「英数字1けた」であるものとしておきます(ただし、現実のISBNコードがすべてこの体系に合致するとは限りません)。

 この定義によって、isbn属性が正規表現パターン「ISBN[0-9]{1}-[0-9]{3,5}-[0-9]{4}-[0-9A-Z]{1}」に合致しない場合には、パーサが妥当性エラーを返します。

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

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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