豊富に用意されたデータ型を利用するSEのためのXML Schema入門(4)

この連載では、XML Schemaについて解説します。簡単なXMLの構造をXML Schemaにより記述できるようになることを目標に、XML Schemaの概要、要素・属性の定義、Complex TypeやSimple Type、属性グループについて解説していきます。連載を読むに当たり、整形式のXMLに関して十分理解していることを前提とします。

» 2004年03月02日 00時00分 公開
[小野彩子株式会社 四次元データ]

 前回は複雑型の要素宣言において、子要素の出現回数や出現の順番などを細かく設定する方法について解説しました。今回は、XML Schemaで豊富に用意されているデータ型について解説します。

テキストの形式をチェックする

 今回は、商品データを表すXML文書を例に取り上げましょう。

<product>
  <name>XMLマスター ラーニングブック −ベーシック−</name>
  <price>2980</price>
</product>
リスト1 商品データ1

 商品データ1は、ルート要素がproductのXML文書です。productの子要素はname要素とprice要素です。ここで、price要素に注目してみましょう。price要素の内容(開始タグと終了タグ)には商品の価格を記述します。ですから、必ず0以上の整数になるはずです。「a」などの文字列や、「1.3」などの小数、「-1000」などのマイナスの数が書かれていては、データの処理を適切に行えません。

 このように、要素の内容や属性の値などのテキスト部分が正しい形式かどうか、検証したいときがあります。いままでのスキーマ言語であるDTDにはそのような機能はなく、「price要素の内容が0以上の整数かどうか」を検証したい場合、新たに検証するプログラムを書かなければいけません。ところが、XML Schemaでは「要素の内容がどんな型をとるべきか」「属性の値はどんな値をとるべきか」を指定することが可能です。XML Schemaで形式を指定すれば、XMLパーサが検証を行ってくれるので、検証プログラムを新たに作成する必要がありません。これは、XML Schemaの大きな利点の1つです。

XML Schemaの豊富なデータ型

 XML Schemaには、あらかじめ使用頻度の高いデータ型が「基本データ型」として用意されています。例えば、「任意の文字列」を表す「string」データ型、「0以上の整数」を表す「nonNegativeInteger」データ型などです。XML Schemaの基本データ型を利用すれば、簡単に要素の内容の形式や、属性の値の形式を指定できます。例えば、price要素の内容が0以上の整数のみの場合、「price要素はnonNegativeInteger型である」と宣言すればよいのです。

 XML Schemaの基本データ型を見ていきます。まずは、数値を表すデータ型です。プログラミング言語に用意されているおなじみのデータ型のほとんどすべてをXML Schemaでも利用できます。

データ型の名前 内容
boolean 真偽 true、false、1、0
base64Binary Base64エンコードされたバイナリ値 GpM7
hexBinary 16進数 0FB7
float 単精度32ビット浮動小数 -INF、-1E4、-0、0、12.78E-2、12、INF、NaN
double 倍精度64ビット浮動小数 -INF、-1E4、-0、0、12.78E-2、12、INF、NaN
decimal 10進数 -1.23、0、123.4、1000.00
integer 整数 -126789、-1、0、1、126789
nonPositiveInteger 0以下の整数 -126789、-1、0
negativeInteger 0未満の整数 -126789、-1
long -9223372036854775808から9223372036854775807までの整数 -1、12678967543233
int -2147483648から2147483647までの整数 -1、126789675
short -32768から32767までの整数 -1、12678
byte -128から127までの整数 -1、126
nonNegativeInteger 0以上の整数 0、1、126789
unsignedLong 0から18446744073709551615までの整数 0、12678967543233
unsignedInt 0から4294967295までの整数 0、1267896754
unsignedShort 0から65535までの整数 0、12678
unsignedByte 0から255までの整数 0、126
positiveInteger 1以上の整数 1、126789
表1 一般的なデータ型

 次に、時や時間を表す基本データ型を紹介します。

データ型の名前 内容
duration ある一定の期間。例は「1年2カ月3日10時間30分12.3秒」を表す P1Y2M3DT10H30M12.3S
dateTime 特定の日時。例は「世界時間(UTC)から5時間遅れの東部標準時における1999年5月31日午後1時20分」を表す 1999-05-31T13:20:00.000-05:00
time 時刻。例は「世界時間(UTC)から5時間遅れの東部標準時における午後1時20分」を表す 13:20:00.000-05:00
date 日付。例は「1999年5月31日」を表す 1999-05-31
gYearMonth グレゴリアン暦の年月。例は「1999年2月」を表す 1999-02
gYear グレゴリアン暦の年。例は「1999年」を表す 1999
gMonthDay グレゴリアン暦の月日。例は「5月31日」を表す --05-31
gMonth グレゴリアン暦の月。例は「5月」を表す --05--
gDay グレゴリアン暦の日。例は「31日」を表す ---31
表2 時や時間を表すデータ型

 文字列を表すデータ型の中には、名前空間などのXMLの機能を実現するためのものがたくさん用意されています。

データ型の名前 内容
string 文字列 Confirm this is electric.
Again ,confirm it.
normalizedString 改行文字、タブ文字を含まない文字列 Confirm this is electric
token 改行、先頭・末尾の空白、および2つ以上連続した空白を含まない文字列 Confirm this is electric
language xml:lang属性の値として有効なもの。XML 1.0で定義されている en-GB、en-US、fr
Name XML 1.0 Name型。要素や属性の名前に使用可能な形式の文字列で、先頭と2文字目以降に使用できる文字が規定された文字列 shipTo
QName XML Namespace のQName。名前空間URIとローカル名の組からなる po:USAddress
NCName XML Namespaceの NCName。QNameより接頭辞とコロンを取り除いたもの USAddress
anyURI URIの形式をした文字列 http://www.example.com/doc.html#ID5
表3 文字列を表すデータ型

 最後にDTDとの互換性を保つために、DTDのデータ型もXML Schemaで使用可能です。DTDには、以下の8つのデータ型しか用意されていなかったのです。

データ型の名前 内容
ID DTDのID型
IDREF DTDのIDREF型
IDREFS DTDのIDREFS型
ENTITY DTDのENTITY型
ENTITIES DTDのENTITIES型
NMTOKEN DTDのNMTOKEN型
NMTOKENS DTDのNMTOKENS型
NOTATION DTDのNOTATION型
表4 DTDとの互換データ型

XML Schemaのデータ型を使う

 それでは、XML Schemaの基本データ型を使用して、要素の内容や属性の値の形式を指定する方法について説明します。

<product>
  <name>XMLマスター ラーニングブック −ベーシック−</name>
  <price>2980</price>
</product>
リスト1 商品データ1(再掲)

 商品データ1は、ルート要素がproductのXML文書です。productの子要素はname要素とprice要素です。name要素は商品の名前、price要素は商品の価格を表します。「price要素の内容は0以上の整数」です。price要素は、以下のように宣言します。

<xsd:element name="price" type="xsd:nonNegativeInteger"/>

図1 商品データ1のツリー構造 図1 商品データ1のツリー構造

 要素の宣言には、xsd:element要素を使用します。name属性の値に、要素の名前を指定します。ここではprice要素を宣言しているので、name属性の値には「price」を指定します。ここまでは、前回までに繰り返し説明してきた要素の宣言方法と変わりませんね。さて、type属性の値に「要素の内容の形式がどうなっているか」を記述します。ここで、「0以上の整数」を表す「xsd:nonNegativeInteger」を指定します。これで、XMLパーサはprice要素の値を検証し、負の数や数字以外の文字列が記入されていた場合にエラーを返す処理を行います。

 ここで1つ、注意点があります。「nonNegativeInteger」はXML Schemaの基本データ型です。ですから、「XML Schemaのデータ型である」ことを表す「xsd:」という接頭辞を基本データ型の前に必ず書きましょう。

 同じように、属性の値の形式も簡単に指定することができます。例えば、商品データXMLに、商品番号を表すproductID属性を追加しましょう。productID属性の値は、必ず「整数」になります。

<product productID="477411751">
  <name>XMLマスター ラーニングブック −ベーシック−</name>
  <price>2980</price>
</product>
リスト2 商品データ2

 productID属性は、以下のように宣言します。

<xsd:attribute name="productID" type="xsd:integer"/>

図2 商品データ2のツリー構造 図2 商品データ2のツリー構造

 属性の宣言について復習しましょう。属性の宣言には、xsd:attribute要素を使用します。name属性の値に属性の名前を記述します。ここではproductID属性を宣言しているので、name属性の値には「productID」を指定しましょう。そして、要素と同じように、type属性の値に「属性の値の形式がどうなっているか」記述します。ここでは、type属性の値に「整数」を表す「xsd:integer」を指定しましょう。ここでも「xsd:」という接頭辞が付いていますね。

 このように、XML Schemaの基本データ型を使用すれば、要素の内容や属性の値の形式を簡単に検証することができます。XMLデータを処理するプログラムの実装負担を軽くするためにも、XML Schemaの基本データ型は積極的に利用しましょう。

 最後に、商品データ2のスキーマの全体も紹介します。

 1:<?xml version="1.0"?>
 2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 3:
 4:  <xsd:element name="product">
 5:    <xsd:complexType>
 6:      <xsd:sequence>
 7:        <xsd:element name="name"
                        type="xsd:string"/>
 8:        <xsd:element name="price"
                        type="xsd:nonNegativeInteger"/>
 9:      </xsd:sequence>
10:      <xsd:attribute name="productID"
                        type="xsd:integer" />
11:    </xsd:complexType>
12:  </xsd:element>
13:
14:</xsd:schema>
リスト3 商品データ2のスキーマ


 今回は、XML Schemaで用意されているデータ型について説明しました。次回はさらに一歩進んで、「自分でデータ型を作る方法」について説明します。(次回に続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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