XMLマスターへの道
〜「XMLマスター:ベーシック」試験対策〜
第14回 XML Schemaを利用したスキーマ定義
内藤一彦NRIラーニングネットワーク株式会社
2004/3/4
今回から2回にわたり、XML Schemaを利用したXML文書構造の定義について紹介していきます。XML Schemaの仕様自体は非常に複雑でボリュームがあり、同じ構造を定義するにもさまざまな表現方法がとれます。今回は、XML Schemaの概要や基本的構造を解説します。
前回、予習問題として下記の問題を出題しておきました。この問題を解くための解説をした後、解答を示します。
今回の問題 | ||||||||
(Q1) XML Schemaの特徴として正しい説明はどれでしょう。正しいものをすべて選んでください。 (a)XML 1.0対応のXMLパーサであれば使用可能である |
||||||||
(Q2) XMLインスタンスで、文字列の値を持つElem要素が0回以上繰り返し出現するとき、このElem要素を定義するXML Schemaを使用する記述として正しいのは次のどれでしょう。
|
今回は、この問題に解答するうえで必要となる下記の内容について解説します。
- XML Schemaの概要
- 仕様概要
- 特徴とDTDとの比較
- データ型体系
- XML Schemaの構造
- ルート要素
- XMLデータ構造の理解
- 複合型の宣言
- 要素の宣言
- 属性の宣言
- XML 文書とXML Schema文書の関連付け
■XML Schemaの概要
仕様概要
「スキーマ」とは一般的に枠組みや構造を指し示すときに用いるキーワードです。XMLの世界で「スキーマ」といえば、XML文書の構造を指します。XML Schemaは2001年にW3Cで勧告されました。DTDの欠点とされていた部分が改善され、今後のスキーマ定義語の標準として採用が進んでいます。
XML Schemaの仕様は次の3つのパートから構成されています。
仕様書名 | 内容 |
Part0:Primer(入門書) | XML Schemaの全体像を解説しているドキュメント |
Part1:Structures(構造) | XML Schemaを使用した定義方法(記述方法)に関する仕様書 |
Part2:Datatypes(データ型) | XML Schemaで使用するデータ型に関する仕様書 |
表1 XML Schema仕様の3つのパート |
XML Schemaでは、構造とデータ型が分離されたことにより、ほかの機能から利用されることが可能となりました。例えばSOAPでは、扱うデータ型としてXML SchemaのPart2:Datatypesを利用できます。
特徴とDTDとの比較
そもそもXMLのスキーマ定義言語としてはDTDが標準でしたが、XMLが基幹業務システムで利用されるなど利用範囲が広まると、次第に欠点が指摘され始めました。XML SchemaではDTDの欠点に対して改善が施されているほかに、出現繰り返し回数の整数値での具体的指定や、要素や属性の値に対して最小値や最大値、文字数などの制限設定など、DTDにはなかったより細かい設定ができるようになりました。
DTDの欠点 | XML Schemaでの改善 |
XML形式ではない | XML形式で定義 |
名前空間に対応していない | 名前空間に対応 |
データ型の概念を持たない | 44の組み込みデータ型が用意されている |
XML文書の中の要素や属性をすべて1つのDTDに定義しなければならない | 複数のスキーマ定義を組み合わせて、1つのXML文書の要素や属性を定義することも可能 |
表2 XML Schemaで改善されたDTDの欠点 |
次に、同じXMLデータの構造を定義しているDTDとXML Schemaの記述例を挙げます。
<!ELEMENT EMPLOYEES ( EMPLOYEE* )> |
リスト1 DTDでの定義 |
<?xml version="1.0" encoding="Shift_JIS"?> |
リスト2 XML Schemaでの定義(emp.xsd) |
XML Schemaで扱うデータ型の体系は次のようになります。
図1 XML Schemaのデータ体系 |
【組み込みデータ型】
プログラム言語やDBMSなどで使用される一般的なデータ型やDTDで利用されていたID型やNMTOKEN型なども含め44のデータ型が用意されています。
代表的なデータ型
xsd:string、xsd:int、xsd:decimal、xsd:float、xsd:double、xsd:boolean、
xsd:dateTime、xsd:date、xsd:time、xsd:ID、xsd:IDREF、xsd:NMTOKEN
組み込みデータ型の一覧については、@ITの記事「XMLテクニック集」−「XML Schemaで単純型要素を定義する」の「XML Schemaデフォルトのデータ型」を参照されるとよいでしょう。
【(ユーザー定義)単純型】
ユーザーが独自に定義する型です。この型は、組み込みデータ型に制限を設定して、新しい型として利用する場合に使います(次回解説します)。
例
xsd:intに最小値や最大値を設定
xsd:stringに最小文字数や最大文字数を設定
【複合型】
ユーザーが独自に定義する型ですが、これはデータ型というよりは要素構造を定義するための型です。次の要素は、ユーザー定義複合型でその型を定義する必要があります。
- 子要素を持つ要素(属性も持つことができる)
- 属性を持つ要素
ルート要素
XML Schema文書はXML形式で作成します。ルート要素には、schema要素を使用します。XML Schemaの名前空間を宣言しましょう。一般的には、「xs」や「xsd」という修飾子を使うことが多いです。
【形式】
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > |
このschema要素の子要素として、複合型、要素、属性の宣言のための要素を記述していきます。
XMLデータ構造の理解
次のデータ構造を持つXML文書に対応するスキーマを作成していきますが、最初にデータ構造をよく理解しておくことが大切です。
図2 XML文書(リスト3)のデータ構造 |
この構造を使用しているXMLは次のとおりです。
<?xml version="1.0" encoding="Shift_JIS" ?> |
リスト3 XML文書(図2のデータ構造を持つ) |
それでは、要素の階層構造に着目してみましょう。
図3 XML文書(リスト3)の階層構造 |
このデータは、2つの階層を持っています。
- EMPLOYEES − EMPLOYEE(青い破線)
- EMPLOYEE − Name、Dept(赤い破線)
XML Schemaでは、要素の階層は複合型として、その構造を定義する必要がありますので、この例では2つの複合型が必要となります。
続いて、属性に注目してみましょう。
図4 XML文書(リスト3)の属性 |
EMPLOYEEはempid属性を持ちますので、これも複合型が必要となります。しかし、複合型では子要素を持つ要素には属性も持たせることができるので、前述の「2. EMPLOYEE − Name、Dept」と共通化されます。
従って、このデータで必要な複合型は、次のようになります。
図5 XML文書(リスト3)に必要な複合型 |
(イ)EMPLOYEES −EMPLOYEE(青い破線)
(ロ)EMPLOYEE − Name、Dept、empid属性(赤い破線)
複合型はcomplexTypeを使用して宣言します。前述の(イ)EMPLOYEES要素用の複合型の宣言は次のようになります。
図6 EMPLOYEES要素用の複合型 |
【複合型の名前】
name属性でこの複合型に名前を付けます。この名前は、EMPLOYEES要素の宣言で使用されます。
【モデルグループ】
モデルグループとは、子要素の出現パターンを定義するものです。次の3つのパターンが用意されています。
モデルグループ | 意味 | DTDでの同機能 |
sequence | 子要素が指定された順番に出現 | ( A , B , C ) |
choice | 子要素はいずれか1つのみ出現 | ( A | B| C ) |
all | 順不同で0回または1回のみ出現 | なし |
表3 モデルグループの子要素出現パターン |
このモデルグループに対して繰り返しを指定することもできます。
例
<xs:sequence minOccurs="1" maxOccurs="unbounded" > |
minOccurs:最小繰り返し回数(省略時:1回)
maxOccurs:最大繰り返し回数(省略時:1回、無制限:unbounded)
これにふさわしい子要素の出現パターンは、(A , B)がセットになって繰り返し
A , B , A , B , A , B …… |
となります。
例では、sequenceを使用していますが、choiceでも同様に使用できます。allを使用するのであれば、0回か1回になるように記述しなければなりません。従って、2回以上やunboundedの指定はできません。
【子要素の参照】
要素を宣言するには、elementを使用します。
<xs:element ref="EMPLOYEE" …… |
ref属性は、ほかの場所で宣言されている要素定義を参照する場合に使用します。従って、後にEMPLOYEE要素を定義する必要があります(後述:「要素の宣言」)。また、この要素に対してモデルグループと同様に、繰り返しの指定が可能です。
続いて、前述の(ロ)EMPLOYEE要素用の複合型の宣言を見てみましょう。
図7 EMPLOYEE要素用の複合型 |
EMPLOYEE要素も子要素を持ちますので、EMPLOYEES要素と同様にモデルグループを用いて子要素の出現パターンを定義します。
さらに、属性も持ちますので、属性の宣言を記述します。
注意
attributeの記述位置に注意が必要です。モデルグループの後に記述してください。
【属性の参照】
属性を宣言するには、attributeを使用します。
<xs:attribute ref="empid" …… |
ref属性は、ほかの場所で宣言されている属性定義を参照する場合に使用します。従って、後にempid属性を定義する必要があります(後述:「属性の宣言」)。
【use属性】
出現に関する指定として、次のいずれかを記述できます。
指定する値 | 意味 | DTDにおける属性リスト宣言との対応 |
optional | 省略可能 | #IMPLIED |
required | 必須。省略不可 | #REQUIRED |
prohibited | 出現禁止 | 対応なし |
表4 use属性に記述できる出現の指定 |
要素は、elementを使用して宣言します。
【形式】
<xs:element name="要素名" |
【type属性】
この要素の型を指定します。型としては、組み込みデータ型やユーザー定義の単純型や複合型の名前を指定します。
【default属性】
デフォルト値を指定することができます。デフォルト値が採用されるのは、空要素となっている場合です。
【fixed属性】
固定値を指定できます。これは、DTDにおける属性リスト宣言の#FIXEDと同様の機能です。「第5回 valid XMLとDTDの関係 属性リスト宣言 表3 属性リスト宣言で指定できるデフォルト値」を参照するとよいでしょう。
では、今回のXMLデータに必要な要素宣言を考えていきましょう。
図8 XML文書(リスト3)に必要な要素宣言 |
<xs:element name="EMPLOYEES" type="EMPLOYEES_type" /> |
今回は、この要素宣言をcomplexTypeのモデルグループ内elementのref属性から参照していますが、次のようにref属性を使用しない方法もあります。
<xs:complexType name="EMPLOYEES_type"> |
要素は、attributeを使用して宣言します。
【形式】
<xs:element name="要素名" |
【type属性】
この属性の型を指定します。型としては、組み込みデータ型かユーザー定義の単純型の名前を指定します。
【default属性】
デフォルト値を指定することができます。属性が記述されていない場合に採用されます。
【fixed属性】
固定値を指定することができます。これは、DTDにおける属性リスト宣言の#FIXEDと同様の機能です。「第5回 valid XMLとDTDの関係 属性リスト宣言 表3 属性リスト宣言で指定できるデフォルト値」を参照するとよいでしょう。
それでは、empid属性のデータ型を「xs:ID」、省略不可とした場合の記述を見てみましょう。
<xs:attribute name="empid" type="xs:ID" /> |
今回は、この属性宣言をcomplexType内attribute のref属性から参照していますが、次のようにref属性を使用しない方法もあります。
<xs:complexType name="EMPLOYEES_type"> |
これで、必要な宣言がすべて出そろいました。全体を見ておきましょう。
リスト4 完成したXML Schema(emp.xsd) |
今回は、複合型に名前を付けて要素宣言のtype属性で参照しましたが、次のようにcomplexTypeをelementの子要素として記述し、名前を付けずに宣言する方法もあります。
<?xml version="1.0" encoding="Shift_JIS"?> |
リスト5 完成したXML Schema(type属性の参照を使わない方法)(emp2.xsd) |
XML文書とDTDの関連付けにはDOCTYPE宣言を使用しましたが、XML Schema文書の関連付けには使えません。次のような方法で関連付けする方法があります。しかし、これは仕様で決められた方法ではないため、実際には使用するXMLパーサの実装方法に従います。
XML Schemaを使用したいXML文書で、次のような記述を行う方法があります。
<?xml version="1.0" encoding="Shift_JIS" ?> |
リスト6 XML文書とXML Schemaの関連付け(employee.xml)、青帯の部分でXML Schema文書のファイルを指定している |
前回、名前空間の確認用に使用したスキーマ検証ツールを使用すれば、XML文書がXML Schema文書で定義した構造に合致しているか確認できます。
図9 「XML検証ツール」による検証結果 |
このほかにも、XML Schema文書を名前空間で関連付けする方法もあります。その方法については、次回でじっくり解説いたします。
■今回の問題の解答
それでは、予習問題の解答です。
(Q1) XML Schemaの特徴として正しい説明はどれでしょう。正しいものをすべて選んでください。
(a)XML 1.0対応のXMLパーサであれば使用可能である
(b)XML形式の文書として記述する
(c)XML文書から参照する場合、DTDと同様にDOCTYPE宣言を記述する
(d)名前空間を使用することができる
答えは、(b)、(d)です。「XML Schemaの概要(特徴とDTDとの比較、データ型体系 組み込みデータ型)」参照。
(a)XML Schemaを利用するためには、XMLパーサ自体がXML Schemaをサポートしている必要があります。
(c)DOCTYPE宣言はDTDの参照に使います。XML Schema文書の参照方法は仕様では決められていませんが、本文中の「XML文書とXML Schema文書の関連付け」で説明されている方法や、名前空間に関連付けさせる方法などがあります。
(Q2) XMLインスタンスで、文字列の値を持つElem要素が0回以上繰り返し出現するとき、このElem要素を定義するXML Schemaを使用する記述として正しいのは次のどれでしょう。
(a) |
<xsd:element name="Elem"* type="xsd:string" /> |
(b) |
<xsd:element name="Elem" type="xsd:string" |
(c) |
<xsd:element name="Elem" type="xsd:string" |
(d) |
<xsd:element name="Elem" type="xsd:string" |
答えは、(d)です。
繰り返しの指定には、minOccurs属性、maxOccurs属性を使用します。maxOccurs属性において、〜以上というように無制限を指定する場合、「unbounded」キーワードを指定します。minOccurs属性、maxOccurs属性ともに省略した場合には1回がとられます。従って、本問題の場合
minOccurs="0" maxOccur="unbounded" |
という指定が必要となります。この問題に関して参考になる解説は、「XML Schemaの構造(複合型の宣言、要素の宣言)」です。
■次回の予習問題
次回のための予習問題を掲載します。
次回も引き続きXML Schemaについて解説します。データ型に最小値や最大値など制限を設けるユーザー定義単純型の記述方法や、XML文書からXML Schema文書を名前空間に関連付けて参照する方法について解説します。
予習問題 | |||||||||
(Q1) 次のユーザー定義単純型で宣言されている構造に合致する、XML文書中のid要素の記述として正しいのはどれでしょう。
(a) <id>AB</id> |
|||||||||
(Q2) 次のように、スキーマ定義として名前空間に関連付けしたXML Schema文書を参照しているXML文書があります。このXML文書が妥当となるXML Schema文書をすべて選択してください。
|
■まとめノート:XML Schemaを利用したスキーマ定義
○今回の試験対策のポイント
- XML Schemaの概要
- 仕様概要
- 特徴とDTDとの比較
- データ型体系
- XML Schemaの構造
- ルート要素
- XMLデータ構造の理解
- 複合型の宣言
- 要素の宣言
- 属性の宣言
- XML 文書とXML Schema文書の関連付け
○今回の学習内容で出題範囲となる仕様
- XML 1.0
- XML Schema
- Namespaces in XML(XML名前空間)
○今回の学習内容で参考になる@ITの記事
○今回の学習内容で参考になるXML用語集 (@IT XML用語事典より)
(15)XML Schema―型の再利用と名前空間 |
連載:XMLマスターへの道 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|