前回解説したDTDは、これまでXMLで広く使われています。しかし、そうした普及に伴い、次に述べるような弱点も目立ってきました。
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には、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自体の名前空間の指定でした。では、この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インスタンスでは、この名前空間を元に、名前空間接頭辞を設定します。
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インスタンスでは、先に作成した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は、XML Schemaの検証ツールです。XMLインスタンスがXML Schemaに適合しているかどうかをチェックし、適合していなければエラーメッセージを出します。W3Cの協力を得ながら、エジンバラ大学でオープンソースのスタイルで開発が進んでいます。
詳しくはXSVのホームページ(http://www.ltg.ed.ac.uk/~ht/xsv-status.html)を参照してください。