目次へ

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を使用する方法とがある

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp