Powered by SmartDoc

XML Schema (1)

DTDの弱点

前回解説したDTDは、これまでXMLで広く使われています。しかし、そうした普及に伴い、次に述べるような弱点も目立ってきました。

XMLらしくない記法。
「要素を組み合わせる」という記法ではないので、わかりにくい。
要素の出現回数、出現順序などの設定に制限が多い。
この要素は2回以上5回まで出現できる、といった指定ができない。また、要素が順不同に出現する、といった指定ができない。
データ型を指定できない。
DTDでは、要素の内容として、他の要素とPCDATA(文字列)の2つしか指定できない。そして、この要素には数字が入る、といったデータ型の指定ができない。
名前空間が使いにくい。
DTDは名前空間を扱うようには設計されていない。また、DTDで定義したタグを名前空間をつけて扱えない。

シンプルな XML Schema の定義

XML Schema とは何か

XML Schemaとは、DTDとは別に、World Wide Web Consortium (W3C)が策定したスキーマ言語です。いま述べたDTDの弱点を補えます。

要素の指定

では、簡単なXML Schemaの例を見てみましょう。XML Schemaの文書は、通常".xsd"という拡張子を持つファイルに保存されます。例えば、次のようなXML文書が"sample01.xsd"という名前のファイルに保存されているとしましょう。

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.wakhok.ac.jp/~tomoharu/students"
            xmlns:st="http://www.wakhok.ac.jp/~tomoharu/students">
	<xsd:element name="name" type="xsd:string" />
</xsd:schema>

属性が多くて、わかりにくく見えるかもしれません。属性を外すと、次のようになります。

<?xml version="1.0"?>
<xsd:schema>
	<xsd:element name="name" type="xsd:string" />
</xsd:schema>

このXML Schemaでは、ただ一つの要素を指定しています。

	<xsd:element name="name" type="xsd:string" />

この部分では、この要素はnameという名前のタグを持ち、その内容はstring (文字列)であることを示しています。

XML Schema の名前空間の指定

このXML Schemaには、xsd:schemaという要素があります。この要素の最初の属性は、次のようになっています。

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

ここでは、"http://www.w3.org/2001/XMLSchema"というURIを名前空間とし、これにxsdという接頭辞を指定しています。これが、XML Schemaの名前空間なのです。つまり、"xsd"からはじまるタグは、XML Schemaではじめから用意されたタグということになります。

このXML Schemaでは、次の2つのタグが使われています。

「この」XML Schema の名前空間の指定

いま見たのは、XML Schema自体の名前空間の指定でした。では、このnameという要素はどのような名前空間を持つのでしょうか?

nameという要素の名前空間は、xsd:schema要素の属性である、次の行で指定されます。

      targetNamespace="http://www.wakhok.ac.jp/~tomoharu/students"
      xmlns:st="http://www.wakhok.ac.jp/~tomoharu/students">

このtargetNamespace属性の値である"http://www.wakhok.ac.jp/~tomoharu/students"が、name要素の名前空間となります。

後で述べるXMLインスタンスでは、この名前空間を元に、名前空間接頭辞を設定します。

XML インスタンス

XML インスタンスの例

DTDやXML Schemaを使って作られたXML文書のことを「XMLインスタンス」と呼びます。

ここでは、先のXML Schemaで指定されたルールによって作られたXMLインスタンスについて見てみましょう。

<?xml version="1.0"?>
<st:name
	xmlns:st="http://www.wakhok.ac.jp/~tomoharu/students"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation=
		"http://www.wakhok.ac.jp/~tomoharu/students  sample01.xsd">
		  	安藤友晴
</st:name>

XML Schemaのときと同じように、属性がわかりにくいので、属性をはずしたものを見てみましょう。

<?xml version="1.0"?>
<st:name>
		  	安藤友晴
</st:name>

かなりすっきりしてきました。XML Schemaで指定したとおり、nameというタグを持つ要素があり、その内容はstring (文字列)になっています。

XML Schema の指定

では、このXMLインスタンスでは、先に作成したXML Schemaをどのように指定しているのでしょうか?

st:name要素の次の属性で指定されているのです。

	xsi:schemaLocation=
		"http://www.wakhok.ac.jp/~tomoharu/students  sample01.xsd">

この属性の値は、XML Schemaで指定した名前空間を示すURIである"http://www.wakhok.ac.jp/~tomoharu/students"と、XML Schemaのファイルそのものである"sample01.xsd"がスペースで区切られたものになっています。

ここで、カレントディレクトリにあるsample01.xsdというファイルと、名前空間のURI "http://www.wakhok.ac.jp/~tomoharu/students"が結び付けられているのです。つまり、名前空間で指定される内容がsample01.xsdに含まれているということになります。

名前空間の指定

最後に、nameという要素の名前空間の指定について解説します。この名前空間は、st:name要素の属性で指定されています。

<st:name
	xmlns:st="http://www.wakhok.ac.jp/~tomoharu/students"

"http://www.wakhok.ac.jp/~tomoharu/students"という名前空間に、"st"という接頭辞がついています。先に見たように、この名前空間の内容はXML Schemaのファイルに記述されています。

属性を外したXMLインスタンスを見てわかるように、nameというタグにstという接頭辞がついています。

<?xml version="1.0"?>
<st:name>
		  	安藤友晴
</st:name>

XSV

XSVは、XML Schemaの検証ツールです。XMLインスタンスがXML Schemaに適合しているかどうかをチェックし、適合していなければエラーメッセージを出します。W3Cの協力を得ながら、エジンバラ大学でオープンソースのスタイルで開発が進んでいます。

詳しくはXSVのホームページ(http://www.ltg.ed.ac.uk/~ht/xsv-status.html)を参照してください。

参考文献・URL

Extensible Markup Language (XML) 1.0 (Third Edition)
W3C XML Schema