豊富に用意されたデータ型を利用する:SEのためのXML Schema入門(4)
この連載では、XML Schemaについて解説します。簡単なXMLの構造をXML Schemaにより記述できるようになることを目標に、XML Schemaの概要、要素・属性の定義、Complex TypeやSimple Type、属性グループについて解説していきます。連載を読むに当たり、整形式のXMLに関して十分理解していることを前提とします。
前回は複雑型の要素宣言において、子要素の出現回数や出現の順番などを細かく設定する方法について解説しました。今回は、XML Schemaで豊富に用意されているデータ型について解説します。
テキストの形式をチェックする
今回は、商品データを表すXML文書を例に取り上げましょう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
商品データ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の基本データ型を使用して、要素の内容や属性の値の形式を指定する方法について説明します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
商品データ1は、ルート要素がproductのXML文書です。productの子要素はname要素とprice要素です。name要素は商品の名前、price要素は商品の価格を表します。「price要素の内容は0以上の整数」です。price要素は、以下のように宣言します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
要素の宣言には、xsd:element要素を使用します。name属性の値に、要素の名前を指定します。ここではprice要素を宣言しているので、name属性の値には「price」を指定します。ここまでは、前回までに繰り返し説明してきた要素の宣言方法と変わりませんね。さて、type属性の値に「要素の内容の形式がどうなっているか」を記述します。ここで、「0以上の整数」を表す「xsd:nonNegativeInteger」を指定します。これで、XMLパーサはprice要素の値を検証し、負の数や数字以外の文字列が記入されていた場合にエラーを返す処理を行います。
ここで1つ、注意点があります。「nonNegativeInteger」はXML Schemaの基本データ型です。ですから、「XML Schemaのデータ型である」ことを表す「xsd:」という接頭辞を基本データ型の前に必ず書きましょう。
同じように、属性の値の形式も簡単に指定することができます。例えば、商品データXMLに、商品番号を表すproductID属性を追加しましょう。productID属性の値は、必ず「整数」になります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
productID属性は、以下のように宣言します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
属性の宣言について復習しましょう。属性の宣言には、xsd:attribute要素を使用します。name属性の値に属性の名前を記述します。ここではproductID属性を宣言しているので、name属性の値には「productID」を指定しましょう。そして、要素と同じように、type属性の値に「属性の値の形式がどうなっているか」記述します。ここでは、type属性の値に「整数」を表す「xsd:integer」を指定しましょう。ここでも「xsd:」という接頭辞が付いていますね。
このように、XML Schemaの基本データ型を使用すれば、要素の内容や属性の値の形式を簡単に検証することができます。XMLデータを処理するプログラムの実装負担を軽くするためにも、XML Schemaの基本データ型は積極的に利用しましょう。
最後に、商品データ2のスキーマの全体も紹介します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
今回は、XML Schemaで用意されているデータ型について説明しました。次回はさらに一歩進んで、「自分でデータ型を作る方法」について説明します。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.