XMLマスターへの道
〜「XMLマスター:ベーシック」試験対策〜
最終回 XML Schema―型の再利用と名前空間
内藤一彦NRIラーニングネットワーク株式会社
2004/4/2
前回「第14回 XML Schemaを利用したスキーマ定義」では、要素や属性の宣言、子要素を持つ要素構造(complexType:複合型)の宣言を中心に、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文書とXML文書の記述方法
- グローバル宣言とローカル宣言
XML Schemaでは型を再利用する機能が用意されており、それを利用するとxs:intやxs:stringなど基本となるデータ型に最小値や最大値、文字数などの制限を設けて、新しい型として使用できます(「第14回 XML Schemaを利用したスキーマ定義」の「XML Schemaの概要 データ型体系」を参照)。指定された制限にマッチしない文書は妥当ではない文書と見なされます。
ユーザー定義単純型はsimpleTypeを使用して宣言します。次のような要素を考えてみましょう。
<EMPLOYEES> |
リスト1 従業員XML |
Salary要素は従業員の給与を表し、0より多く100万円以下でなければなりません。このとき、Salary要素の型は次のような形で宣言することになります。
リスト2 Salary要素用のユーザー定義単純型 |
型の名前
name属性でこの型に名前を付けます。この名前は、SALARY要素の宣言で使用されます。
ベースとなる型
制限をかけるベースとなる型を指定します。
制限内容
xs:restriction要素の子要素として、制限内容を定義します。制限は複数の種類を組み合わせて使えます。制限の種類としては、次のものがあります(ベースとなる型によって使用できる種類が異なる)。
制限の種類 | 説明 |
length | 文字数 |
minLength | 最小文字数 |
maxLength | 最大文字数 |
pattern | 文字パターン |
enumeration | 候補値 |
whiteSpace | 空白文字の正規化 |
minInclusive | 最小値(指定した値を含む) |
maxInclusive | 最大値(指定した値を含む) |
minExclusive | 最小値(指定した値を含まない) |
maxExclusive | 最大値(指定した値を含まない) |
totalDigits | 最大けた数 |
fractionDigits | 小数点以下の最大けた数 |
表1 子要素として指定できる制限内容 |
patternの使用例
<xs:simpleType name="ItemCode_type"> |
|
従って、次のようなパターンの文字列がこれにマッチします。
enumerationの使用例
<xs:simpleType name="DeptCode_type"> |
xs:enumerationで指定された値がそれぞれ候補値となります。従って、この例では「A01」「A02」「B01」「B02」のいずれかの値をとらなければなりません。
では、次のようなXML文書を検証してみましょう。Salaryの値が10000000となっており、maxInclusiveの制限に違反しています。
<?xml version="1.0" encoding="Shift_JIS" ?> |
リスト3 スキーマに違反したXML文書(validerror.xml) |
<?xml version="1.0" encoding="Shift_JIS"?> |
リスト4 従業員XMLのスキーマ(emp.xsd) |
前回も使用したスキーマ検証ツールで検証を行うと、図1のようにSalaryでエラーが発生したことが分かります。
図1 リスト3の検証結果(エラー発生)(クリックで拡大します) |
XML Schema文書とXML文書の記述方法
リスト4(emp.xsd)で紹介したXML Schema文書は名前空間を利用しないものでした。従って、このXML Schema文書を利用するXML文書(リスト5)でも、XML Schema文書で宣言されているそれぞれの要素や属性は名前空間には所属しないことになります。
<?xml version="1.0" encoding="Shift_JIS" ?> |
リスト5 名前空間を利用しない従業員XML(emp.xml) |
これに対して、次のXML Schema文書(リスト6)では、宣言されている要素や属性などは、名前空間に所属するようになります。
<?xml version="1.0" encoding="Shift_JIS"?> |
リスト6 名前空間を利用しているXML Schema文書(empschema.xsd) |
XML Schema文書で名前空間を利用しているとは、定義した要素・属性や複合型・ユーザー定義単純型が、その名前空間に属することです。XML文書でこれらの要素や属性を使用する場合には、その名前空間を使用しなければなりません。このXML
Schema文書に合致するXML文書は次のような形となります。
<e:EMPLOYEES xmlns:e="http://www.abc.com/EMPLOYEE" ……(5) |
リスト7 名前空間を記述した従業員XML(empschema.xml) |
EMPLOYEESやそのほかの要素やempid属性が、「http://www.abc.com/EMPLOYEE」という名前空間に所属しています。この名前空間こそ、XML Schema文書で宣言した名前空間となります。
XML Schema文書の記述形式
それでは、XML Schema文書での記述を解説していきます。
(1)targetNamespace="http://www.abc.com/EMPLOYEE"
targetNamespace属性を使用して名前空間識別子(名前空間の名前)を付けます。宣言した要素や属性、複合型・単純型が所属することになります。
(2)xmlns:tns="http://www.abc.com/EMPLOYEE"
(3)<xs:element ref="tns:EMPLOYEE" …… />
(4)<xs:element name="EMPLOYEES"
type="tns:EMPLOYEES_type" />
宣言した要素や属性、複合型・単純型は名前空間に所属します。名前空間に所属するこれらを参照する場合、名前空間の宣言を行い、プレフィックスを指定する必要があります(「第13回 名前空間を理解しDOMの概要をつかむ」の「名前空間(宣言と利用)」を参照)。
(2)はそのための名前空間の宣言ですが結果的には、targetNamespaceで付けた名前の名前空間に対してプレフィックスを宣言する形となります。(3)と(4)はプレフィックスを付けて要素や複合型を参照しています。もし、(4)でプレフィックスを付けずに下記のように記述した場合、EMPLOYEE_type複合型は参照できません。
<xs:element name="EMPLOYEES" type="EMPLOYEES_type"/> ……
エラー |
前述の検証ツールでチェックしてみると、名前空間に所属していないEMPLOYEES_typeを参照できないためにエラーが発生していることが分かります。
図2 リスト7の検証結果(エラー発生)(クリックで拡大します) |
XML文書の記述形式
続いてXML文書での記述を解説していきます。
(5)xmlns:e="http://www.abc.com/EMPLOYEE"
XML Schema文書で宣言した名前空間を利用するために記述します。XML Schema文書のtargetNamespaceで付けた名前と一致させます。
(6)xsi:schemaLocation="http://www.abc.com/EMPLOYEE empschema.xsd"
名前空間とXML Schemaファイルを関連付けています。これにより、XML Schemaファイルが参照できるようになります。
後は、要素や属性に(5)で宣言したプレフィックスを付記すればOKです。
XML Schema文書における要素や属性などの宣言は、グローバル宣言として扱われるものとローカル宣言として扱われるものがあります。
グローバル宣言
・XML Schema文書内のいずれからも参照可能
・名前空間に所属する
ローカル宣言
・記述されている範囲内でのみ参照可能
・名前空間に所属しない
グローバル宣言として扱われるのは、ルート要素(xs:schema)直下の子要素として宣言されている要素や属性や型の宣言です。いままで使用してきた要素の定義(<xs:element name="XXX" …… />)はすべてグローバル宣言として扱われてきたことになります。
ローカル宣言となるのは、ルート要素(xs:schema)直下の子要素ではなく、ある要素の子要素として宣言したものです。
次の2つのEMPLOYEE要素の宣言を見比べてみましょう。
<xs:complexType name="EMPLOYEES_type"> |
グローバル宣言 |
<xs:complexType name="EMPLOYEES_type"> |
ローカル宣言 |
xs:complexType要素の中で<xs:element name="EMPLOYEE" …… />とEMPLOYEE要素を宣言しています。これは、ローカル宣言として扱われることになりますので、ほかの場所から<xs:element ref="EMPLOYEE">のように参照することはできません。そして、ローカル宣言はtargetNamespaceの名前空間に所属しなくなります。その結果、それに合致するXML文書は次のような形式になってしまいます。
<e:EMPLOYEES xmlns:e="http://www.abc.com/EMPLOYEE" |
リスト8 ローカル宣言に対応させたXML文書(empschema2.xml) |
<?xml version="1.0" encoding="Shift_JIS"?> |
リスト9 ローカル宣言を含んだXML Schema文書(empschema2.xsd) |
このXML Schema文書でのグローバル・ローカル宣言の扱いは次のようになります。
ローカル宣言
EMPLOYEE要素
グローバル宣言
EMPLOYEES要素、Name要素、Salary要素、empid属性、
EMPLOYEES_type複合型、EMPLOYEE_type複合型、
Salary_type単純型
従って、EMPLOYEE要素のみこの名前空間には所属せず、ほかの要素・属性・型宣言はすべて「http://www.abc.com/EMPLOYEE」の名前空間に所属します。
ローカル宣言をグローバル扱いにする
前述のEMPLOYEE要素のようにxs:schema直下の子要素ではなくxs:complexType要素内で、要素宣言を行うとローカルとして扱われてしまいますが、次の記述をすることによりグローバル扱いにできます。
(1)当該宣言に form="qualified"を記述する
(2)xs:schemaでelementFormDefault="qualified"を記述する
(1)form="qualified"を記述する
本来ローカル宣言となってしまう場所に記述されているものでも、form="qualified"を記述すると、グローバル扱いとなり名前空間に所属するようになります。前述のEMPLOYEE要素をグローバル扱いにするのであれば、次のような記述をします。
<xs:complexType name="EMPLOYEES_type"> |
逆に、グローバル宣言をローカル扱いにしたいのであれば、form="unqualified"を記述します。
(2)elementFormDefault="qualified"を記述する
これは、各宣言に(1)のform="qualified"のデフォルト値を設定する方法です。xs:schemaでelementFormDefault="qualified"を記述することにより、(1)の記述は必要なくなります。次の記述も、同様の構造を定義していることになります。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" |
XML Schema文書を自動的に生成するようなツールでは、(2)のパターンで出力するものも多いようです。
■今回の問題の解答
それでは、予習問題の解答です。
(Q1) 次のユーザー定義単純型で宣言されている構造に合致する、XML文書中のid要素の記述として正しいのはどれでしょう。
<xs:simpleType name="restid"> |
答えは、(d)です。
string型のデータに文字パターンの制限をかけています。ポイントは次のとおりです。
- [ ]:範囲
- { }:繰り返して出現
- \d:数字
従って、A〜Zの間の文字が2つ続き、その後に−(ハイフン)、最後に数字が3つ続く文字パターンが必要です。この問題に関して参考になる解説は、「ユーザー定義単純型の定義」です。
(Q2) 次のように、スキーマ定義として名前空間に関連付けしたXML Schema文書を参照しているXML文書があります。このXML文書が妥当となるXML Schema文書をすべて選択してください。
<emp:EMPLIST |
答えは、(b)と(d)です。
このXML文書で使用されている要素・属性はすべて「http://www.abc.com/EMP-Schema」の名前空間に所属しています。すなわち、XML Schema文書を考えた場合、グローバル扱いにしなければならないということです。
(a)は名前空間がまったく考慮されていません。(c)はelementFormDefault="qualified"の記述があるのですが、複合型や要素を参照するときに名前空間が考慮されていません。
(b)は、要素や属性、複合型の宣言はすべてxs:schema直下の子要素として記述されていますので、グローバルであり名前空間に所属します。それらを参照する場合も名前空間のプレフィックスを使用していますので問題ありません。
(d)では、elementFormDefault="qualified"を記述していますので、要素の宣言はグローバルであり、名前空間に所属します。しかし、この記述は属性に対しては無効です。従って、id属性の宣言ではform="qualified"が指定されています。また、属性用にはelementFormDefaultと同じ目的としてのattributeFormDefaultがあります。属性の宣言の部分でform="qualified"を記述する代わりに、xs:schemaでattributeFormDefault="qualified"を記述してもOKです。
この問題に関して参考になる解説は、「XML Schema文書での名前空間の利用のグローバル宣言とローカル宣言」です。
◇
今回で『XMLマスターへの道 〜「XMLマスター:ベーシック」試験対策〜』の連載は完結です。長い間ご愛読いただき、ありがとうございました。(編集局) |
■まとめノート:XML Schemaを利用したスキーマ定義
○今回の試験対策のポイント
- ユーザー定義単純型の定義
- XML Schema文書での名前空間の利用
- XML Schema文書とXML文書の記述方法
- グローバル宣言とローカル宣言
○今回の学習内容で出題範囲となる仕様
- XML 1.0
- XML Schema
- Namespaces in XML(XML名前空間)
○今回の学習内容で参考になる@ITの記事
○今回の学習内容で参考になるXML用語集 (@IT XML用語事典より)
連載: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」の詳細も紹介する
|
|