XMLの基本 7章 Namespace
- 7.1 Namespaceの意義
- 7.2 Namespaceの定義
- 7.3 要素とNamespace
- 7.4 属性とNamespace
- 7.5 DTDとNamespaceの問題
- 7.6 まとめ
7.5 DTDとNamespaceの問題
XMLのスキーマ言語、DTDはNamespaceに対応していない、ということは、何回か記述しています。このことについて、詳しく説明したいと思います。
次の3つの文書を例に示します。
<?xml version="1.0"?> <memo> <from>foo</from> <to>bar</to> <p>「名前空間」という本の注文を受けました。</p> <book:book xmlns:book="http://book.or.jp" > <book:author>XML太郎</book:author> <book:title>名前空間</book:title> <book:ISBN>4-532-14610-0</book:ISBN> <book:price>2000</book:price> </book:book> </memo>
例1 名前空間を使用する箇所で宣言する場合
<?xml version="1.0" > <memo xmlns:book="http://book.or.jp"> <from>foo</from> <to>bar</to> <p>「名前空間」という本の注文を受けました。</p> <book:book> <book:author>XML太郎</book:author> <book:title>名前空間</book:title> <book:ISBN>4-532-14610-0</book:ISBN> <book:price>2000</book:price> </book:book> </memo>
例2 名前空間を文書要素で宣言する場合
<?xml version="1.0" > <memo xmlns:bk="http://book.or.jp"> <from>foo</from> <to>bar</to> <p>「名前空間」という本の注文を受けました。</p> <bk:book> <bk:author>XML太郎</bk:author> <bk:title>名前空間</bk:title> <bk:ISBN>4-532-14610-0</bk:ISBN> <bk:price>2000</bk:price> </bk:book> </memo>
例3 名前空間を文書要素で宣言する場合
例1では, 名前空間が必要になったときに宣言しています。例2では, 文書要素(ルート)で宣言しています。例3の文書も文書要素で宣言していますが, 接頭辞が異なります。この3つの文書は表記の仕方は異なるが、Namespaceも含めてXML文書としては等価な文書になります。
ここで、上の文書のDTDを記述することを考えます。DTDを使用する場合は, あらかじめ属性も宣言しなければならず, どの要素型に対して使用するかも明示しなければいけません。そのため, これらの三つのXML文書に共通のDTDを書くことはできません。これが, 現状のXMLと名前空間との間で生じる問題です。
実際、Namespaceを使用してXMLのDTDを記述しようとした場合、以下のような固定的なDTDを記述する必要があります。
<!DOCTYPE memo [ <!ELEMENT memo (from,to,(p|book:book)*) > <!ELEMENT from (#PCDATA) > <!ELEMENT to (#PCDATA) > <!ELEMENT p (#PCDATA) > <!ELEMENT book:book (book:author, book:title, book:ISBN,book:price) > <!ATTLIST book:book xmlns:book CDATA #FIXED "http://book.or.jp"> <!ELEMENT book:author (#PCDATA) > <!ELEMENT book:title (#PCDATA) > <!ELEMENT book:price (#PCDATA) > <!ELEMENT book:ISBN (#PCDATA) > ]>
上のDTDは例1に対するDTDになります。しかし、例2や例3のXML文書を記述した場合、エラーになり、Namespaceの使用が大きく制限されます。
7.6 まとめ
- NamespaceはXML文書をモジュール化し、再利用する目的で開発された
- Namespaceは要素と属性の集合であり、全要素区画、大域属性区画、要素ごとの属性区画の3つの区画をもつ
- NamespaceはURIより特定する
- Namespaceを指定するには、Namespace接頭辞を使用する方法と、デフォルトNamespaceを使用する方法とがある