XMLデータの構文ルールを記述するDTDですが、実は最新のXML用途には力不足です。そこでDTDの後継として登場したのがXML Schema。まずは一番やさしいXML Schemaの記述方法である「単純型要素の定義」から解説します。
| カテゴリ | XML Schema | |
| 関連要素 | <xsd:schema>、<xsd:element> | |
| 関連記事 | XML Schemaで複雑型要素を定義する | |
システム間におけるXMLデータ交換が恒常化するにつれ、データフォーマットの妥当性検証を自動化・簡潔化するニーズは高まっています。例えば、注文データ1つ交換するにしても、企業ごとにフォーマットが異なっていたらどうでしょう。以下の2つのXML文書を見てください。
<order id="000-00-0" customer="A0001" products="X-009Z" |
<order id="000-00-0"> |
いずれの文書も人間の目から見れば同じ意味を表していますが、システム的にはまったく異なる情報です。もしもこのようなデータを解析したいという場合には、まず上記のXML文書をXSLTなどでフォーマット変換してから、あらためて読み取る必要があります。
これがまだ2通り程度であればそれも現実的でしょうが、N社と商取引を行うのにN個のデータフォーマットがあったとしたらどうでしょう。それこそ「データ変換のスパゲティ」になってしまいます。しかも、変換ルールを定めるために、多くのコストと工数とを割かなければなりません。
そこで、データ交換の局面においては、共通の正しい形式をあらかじめルール付けしておく必要が出てくるのです。これが、別稿「DTDで要素型宣言を定義する」「DTDで属性リスト宣言を定義する」などでもご紹介したDTD(Document Type Definition)の役割でした。DTDを使用することで、XMLパーサ(解析アプリケーション)は自動的にデータの妥当性を検証(Validate)することができるので、新たなアプリケーションの開発も、ましてや人手によるデータチェックの必要性もなくなります。
しかし、DTDにはいくつかの問題点があります。
以上のような問題点を克服するために登場したのがXML Schemaなのです。XML SchemaはXML構文にのっとって記述される文書型宣言ですので、当然、名前空間の概念をサポートします。また、日付や数値などの主要なデータ型や、さらに数値の中でも負数、正数、−10〜10といった範囲までさまざまな制約条件を定義することが可能です。
XML Schemaの概念はあまりに多岐にわたりますので、今後おいおいご紹介していくことにしますが、ここではまず、最も基本的なサンプルをご紹介しておくことにしましょう。
[simple.xml] |
[simple.xsd] |
XML Schemaの拡張子は、慣例的に「.xsd」とします。また、XML Schemaのルート要素は<xsd:schema>要素となります。xmlns:xsd属性までを1つの決まり文句として覚えてておくとよいでしょう。
今回の例で、実際に文書型の定義を行っているのは、<xsd:element>要素になります。上のsimple.xmlは<birthday>要素1つからなる単純なXML文書ですので、XML Schemaの定義も単純な一文を記述するのみです。
<xsd:element>要素のname属性は要素の名前を、type属性はデータ型を指定します。
type属性に指定可能なXML Schemaデフォルトのデータ型を以下の表に挙げておくことにしましょう。大文字で記述されたものは基本データ型、小文字で記述されたものはXML Schema拡張のデータ型です。拡張データ型を指定するに際しては、頭に「xsd:」と付加しなければならない点に注意してください。
| データ型 | 概要 |
|---|---|
| binary | バイナリデータ |
| boolean | 真偽(true、false) |
| byte | バイト型(−127〜128) |
| century | 世紀(例:21) |
| date | 日付型(例:2003-12-15) |
| decimal | 10進数 |
| double | 64bit倍精度浮動小数点 |
| ENTITY | 実体型 |
| float | 32bit単精度浮動小数点 |
| ID | ID型 |
| IDREF | ID参照型 |
| IDREFS | ID参照型の集合体 |
| integer | 整数型(−2147483648〜2147483647) |
| long | 長整数型(−9223372036854775808〜9223372036854775807) |
| month | 月(例:2003-12) |
| NAME | 名前(例:XML1.0) |
| NCNAME | コロンなしの名前 |
| negativeInteger | 負の整数(0を含まない) |
| NMTOKEN | NMTOKEN型 |
| NMTOKENS | NMTOKEN型の集合体 |
| nonNegativeInteger | 0以上の整数(0を含む) |
| nonPositiveInteger | 0以下の整数(0を含む) |
| NOTATION | 記法型 |
| positiveInteger | 正の整数(0を含まない) |
| QNAME | 名前(XML Namespaces) |
| short | 短整数型(−32768〜32767) |
| string | 文字列 |
| time | 時刻型(例:23:53:15.000) |
| timeDuration | 期間(例:P1Y5M3DT10H13M35.41(1年5カ月3日と10時間13分35.41秒) ) |
| unsignedByte | 符号なしバイト型(0〜255) |
| unsignedInt | 符号なし整数型(0〜4294967295) |
| unsignedLong | 符号なし長整数型(0〜18446744073709551615) |
| unsignedShort | 符号なし短整数型(0〜65535) |
| uriReference | URI(Uniform Resource Identifier:ネットワーク上の位置情報)(例:http://www.w3.org/2001/XMLSchema/ ) |
| year | 年(例:2003) |
| XML Schemaデフォルトのデータ型 | |
いかがですか? XML Schemaといっても、なんら構える必要はなく、ただこれだけのことです。これから複数の要素や属性を含むXML文書が登場しますが、見掛けの複雑さに惑わされず、本稿のシンプルな例をベースにおいて学習を進めていくと、より分かりやすいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.