名前空間

みるくあいらんどっ! > ドキュメント > XML > 基礎だけ学ぶ XML講座 [初心者向け・入門]


複数の XML応用規格を組み合わせる

例えば、ワープロソフトを作成するとします。その保存形式は XML形式(独自の XML応用規格)になるかもしれません。例えば、以下のような文書になるかもしれません。

<?xml version="1.0" encoding="UTF-8"?>
<document>
	<p>これは段落です。</p>
	<p color="red">これは第 2段落です。</p>
</document>

さて、このワープロソフトに画像の挿入機能を追加するとします。挿入する画像は SVG形式とするとします。SVGは XML応用規格のひとつなので、上記の XML文書に取り込むことができます。具体的には以下のような形式になるかもしれません。

<?xml version="1.0" encoding="UTF-8"?>
<document>
	<p>これは段落です。以下に画像を挿入します。</p>
	<svg width="640px" height="400px" version="1.1">
		<rect x="50" y="50" width="250" height="100" fill="blue" />
		<circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" />
	</svg>
	<p color="red">これは第 2段落です。以下に画像を挿入します。</p>
	<svg width="640px" height="400px" version="1.1">
		<rect x="50" y="50" width="250" height="100" fill="blue" />
		<circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" />
	</svg>
</document>

この場合はこれで問題ないように思えます。XML文書としてのルールも満たしています。

しかし、このような記述の仕方では、ワープロ文書側が持つ要素と、SVG規格側がもつ要素を区別することができません。したがって、もしワープロ文書側に既に svgという名前の要素があった場合、あるいは rectや circleという名前の要素が存在した場合、ワープロ文書としての取り扱いが非常に複雑になります。逆に、SVG規格側が、もし、pや documentという名前の要素に意味を持たせていた場合も、取り扱いが複雑になります。

そして、この先、ワープロソフトをさらに機能向上していく過程で、さらに他の XML応用規格を取り込んでいく場合(例えば、数式や表を表現するための XML応用規格を使用するかもしれません)、それぞれの XML文書の要素の名前に重複がないように気をつけなければならないということになります。あるいは、要素の名前に重複がないことを祈るしかない、というようなことになりかねません。

このように、1つの XML文書の中に複数の XML規格を含めようとすると、要素名の重複の問題が発生します。この問題を解決するための概念が名前空間です。

名前空間

名前空間を使用すると、要素が属する空間をそれぞれ指定することができます。先の例で言えば、ワープロ文書側と SVG規格が持つ要素が、まったく別のものであることを示すことができます。

名前空間を使用するための手順は以下のとおりです。

  1. 名前空間を、「xmlns」という特別な接頭辞を用いて別名に設定します。
  2. 要素名の接頭辞に、その名前空間の別名を記述します。

基本的な記述方法は以下のとおりです。

<別名:要素 xmlns:別名="URI">
  <別名:子要素 属性名="属性値" />
 …
</別名:要素>

名前空間についての注意点は以下のとおりです。

  • 名前空間にはURIを指定します。この URIは名前空間を識別するための文字列というだけで、それ以上の意味はありません。XML文書を表示するためにこの URIにアクセスする必要はありません。また、この URIをウェブブラウザでアクセスした場合、何らかのウェブページが表示されるかもしれないし、何も表示されないかもしれません。Javaを勉強した方であれば、URIの文字列とは、ユニークなパッケージ名の決め方と非常に近いものと捉えれば良いと思います。
  • 名前空間の別名は、要素名の前に接頭辞としてつけなければなりません。また、その子側の要素にも別名を接頭辞としてつける必要があります。ただし、次節で解説するデフォルト名前空間は例外になります。
  • 名前空間の別名は、属性名の前には基本的にはつけません。属性名の前に接頭辞としてつける場合には、グローバル属性という別のルールが適用されることになります。つまり、属性名の前につける場合には意味合いが変わってきます。なお、グローバル属性については後の章で解説します。
  • 名前空間の別名を、「xml」にすることはできません。「xml接頭辞」には特別な意味があるため、別名として設定できないというルールになっています。

先のサンプルに名前空間を適用すると、例えば、以下のような形式になります。なお、ワープロ文書側の名前空間を「http://www.test.com/xml/document/」とし、SVG側の名前空間は、SVG仕様に記述されているように「http://www.w3.org/2000/svg」を使用するとします。

<?xml version="1.0" encoding="UTF-8"?>
<d:document xmlns:d="http://www.test.com/xml/document/">
	<d:p>これは段落です。以下に画像を挿入します。</d:p>
	<s:svg xmlns:s="http://www.w3.org/2000/svg" width="640px" height="400px" version="1.1">
		<s:rect x="50" y="50" width="250" height="100" fill="blue" />
		<s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" />
	</s:svg>
	<d:p color="red">これは第 2段落です。以下に画像を挿入します。</d:p>
	<s:svg xmlns:s="http://www.w3.org/2000/svg" width="640px" height="400px" version="1.1">
		<s:rect x="50" y="50" width="250" height="100" fill="blue" />
		<s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" />
	</s:svg>
</d:document>

この例では、ワープロ文書側の名前空間の別名を「d」に、SVG側の名前空間の別名をそれぞれ「s」に設定しています。要素名には接頭辞として別名をつけ、属性名には接頭辞をつけていないことが確認できるでしょうか。

方法はひとつではないということで、もうひとつの例を挙げておきます。

<?xml version="1.0" encoding="UTF-8"?>
<d:document
		xmlns:d="http://www.test.com/xml/document/"
		xmlns:s="http://www.w3.org/2000/svg">
	<d:p>これは段落です。以下に画像を挿入します。</d:p>
	<s:svg width="640px" height="400px" version="1.1">
		<s:rect x="50" y="50" width="250" height="100" fill="blue" />
		<s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" />
	</s:svg>
	<d:p color="red">これは第 2段落です。以下に画像を挿入します。</d:p>
	<s:svg width="640px" height="400px" version="1.1">
		<s:rect x="50" y="50" width="250" height="100" fill="blue" />
		<s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" />
	</s:svg>
</d:document>

この例では、ルート要素(document要素)で 2つの名前空間の別名を宣言しています。

今回、名前空間を使用することにより、ワープロ文書側の要素と SVG側の要素を明確に区別することができ、上手く同居させることができました。このように、名前空間を使用すれば、複数の XML規格を上手く同居させることができるようになります。

最終更新: 2014/03/27 , 公開: 2014/03/26
▲top