- 8.1 Namespaceとは
- 8.2 Target Namespace
- 8.3 スキーマの指定
- 8.4 schemaLocation、noNamespaceSchemaLocation
- 8.5 まとめ
8.3 スキーマの指定
DTDでは、そのXML文書のスキーマを表しているDTDはどこにあるのか、DOCTYPE宣言で指定しました。では、スキーマ言語がXML Schemaの場合、XML文書のスキーマはどのように指定すればよいのでしょう。XML Schemaでは、Namespaceを使用して、どのスキーマで書かれたXML文書であるか判別するのです。XML 文書中では、適用するXML SchemaのTarget Namespaceを指定します。
ここで、復習します。XML文書の要素や属性がどこのNamespaceに属しているか、指定する方法には、以下の2つがあります。
- Namespace接頭辞を使用する方法
- デフォルトNamespaceを設定する方法
Namespace接頭辞を使用する場合は、まず、その接頭辞がどこのNamespaceを示すものなのか、定義します。
xmlns:Namespace接頭辞 = "名前空間を示すURI"
接頭辞を使用する場合は、要素名や属性名の前に、Namespace接頭辞をコロンで区切って記述します。これで、要素や属性はNamespace接頭辞に関連付けられたNamespaceに属している、ということを表しています。
<Namespace接頭辞 : 要素名 Namespace接頭辞 : 属性名="属性値"/>
以下に例を示します。
<paper:paper xmlns:paper="http://www.4dd.co.jp/paperinfo"> <paper:title>連続曲線箱桁の解法</paper:title> <paper:author> <people:name xmlns:people=":http://www.4dd.co.jp/peopleinfo">後藤茂夫<people:name> <peopletitle>教授</people:title> </paper:author> </paper:paper>
上の例では、"paper"という接頭辞を"http://www.4dd.co.jp/paperinfo"というNamespaceに対応させています。2行目のtitle要素には、"paper"という接頭辞がついています。これは、2行目のtitle要素は"http://www.4dd.co.jp/paperinfo"というNamespaceに属していることを表します。また、peopleというNamespace接頭辞も定義されています。people接頭辞は、"http://www.4dd.co.jp/peopleinfo"という名前のNamespaceに対応されています。5行目のtitle要素には"people"というNamespace接頭辞がついています。これは、5行目のtitle要素は"http://www.4dd.co.jp/peopleinfo"というNamespaceに属していることを表します。
もうひとつの方法が、デフォルトNamespaceを使用する方法です。デフォルトNamespaceはxmlns属性を使用して定義します。
<要素名 xmlns="デフォルトNamespaceのURI"/>
以上のように宣言した場合、Namespaceの指定がない子供要素、孫要素はデフォルトNamespaceに属するものと認識されます。以下に例を示します。
<?xml version="1.0"?> <html xmlns='http://www.w3.org/TR/REC-html-40'> <head> <title>Frobnostication</title> </head> <body> <p>Moved to <a href='http://frob.com'>here.</a></p> </body> </html>
ルート要素である、html要素の開始タグでデフォルトNamespaceを定義しています。デフォルトNamespaceは"http://www.w3.org.TR.REC-html-40"です。Namespace接頭辞が設定されている要素や属性はありません。これより、html、head、title、body、p、aの要素はすべて"http://www.w3.org.TR.REC-html-40"という名前のNamespaceに属していることがわかります。
では、XML 文書よりXML Schemaを参照する方法を、例を挙げて説明します。以下のように、XMLのスキーマを作成しXML Schemaで記述したとします。
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/PO1" xmlns:po="http://www.example.com/PO1"> ... <xsd:element name="purchaseOrder" type="po:PurchaseOrderType"/> <xsd:element name="comment" type="xsd:string"/> ... </xsd:schema>
上のXML SchemaのTarget Namespaceは、"http://www.example.com/PO1" です。そこで、上のスキーマに沿ったXML文書を記述したとします。XML 文書に「上のスキーマに沿った文書である」ことを明示するには、Namespaceによって指定します。
<?xml version="1.0"?> <purchaseOrder orderDate="1999-10-20" xmlns="http://www.example.com/PO1"> <shipTo country="US"> ... </shipTo> ... <comment>Hurry, my lawn is going wild!</comment> ... </purchaseOrder>
上のXML文書のデフォルトNamespaceは"http://www.example.com/PO1"です。よって、Namespace接頭辞を持たないpurchaseOrder要素やcomment要素は 、 "http://www.example.com/PO1"という名前のNamespaceに属していることがわかります。そして、"http://www.example.com/PO1"は、先ほどのXML SchemaのTarget Namespaceでもあります。これにより、XML パーサは、XML 文書中のpurchaseOrderやcommentの要素が上のXML Schemaで作成されたスキーマに従っているか、チェックを行います。