名前空間を使う

前回まではXML文章で使用するタグを取り決めるDTDについて見てきました。次回からはDTDに変わって新しく策定されたXML Schemaについて見ていきますが、その前に今回は「名前空間」について考えてみます。

まずは以下のサンプルを見てください。

<?xml version="1.0" encoding="UTF-8" ?>
<FavoriteList>
  <book>
    <title>博士の愛した数式</title>
    <price>4000</price>
  </book>
  <game>
    <title>DARK SOULS Ⅱ</title>
    <price>529</price>
  </game>
</FavoriteList>

titleという名前の要素が2つ登場しており、ひとつは本の「タイトル」をあらわし、もうひとつはゲームの「タイトル」をあらわしています。

上記サンプルのように同じ名前のタグが重複していた場合、どこで取り決めたものなのかわからなくなってしまいます。それらのタグを区別するための仕組みが必要でしょう。

そのための仕組みが名前空間(namespace)です。

同じ名前の混在させたXML文書を作成するような場合はその名前空間と呼ばれる仕組みを使用します。

名前空間とは

上記サンプルで出てきた「title」の他に、「name」「price」などは、あらわしたい対象はそれぞれ異なっていてもタグの名前が重複してしまうことは必然です。しかし、タグの取り決めを行うためには、世界で一意に定まる名前を持つための仕組みが必要です。

その仕組みが前述した名前空間です。

早速、上記サンプルに名前空間の仕組みを取り入れてみます。

<?xml version="1.0" encoding="UTF-8" ?>
<FavoriteList xmlns:A="http://www.sample.com/book"
              xmlns:B="http://www.sample.com/game">
  <A:book>
    <A:title>博士の愛した数式</A:title>
    <A:price>4000</A:price>
  </A:book>
  <B:game>
    <B:title>DARK SOULS Ⅱ</B:title>
    <B:price>529</B:price>
  </B:game>
</FavoriteList>

名前空間をあらわすにはURIを指定します。URIは何を指定しても良いですが、ここで指定してURIが一意に定めるための識別子になります。

今回のサンプルでは、重複していたタグに「A」「B」という記述が追加されています。この部分はプレフィックス(prefix)と呼ばれ、初めに「xmlns:プレフィックス=・・・」と指定し、そのあとで要素名の前に「プレフィックス:」と記述すれば、指定したURIで判別される名前空間をあらわすことになります。

名前空間をあらわすための構文は以下になります。

< ・・・ xmlns:プレフィックス="識別するためのURI">
  ・・・
<プレフィックス:要素名> ・・・ <プレフィックス:要素名>

URIについて

名前空間においていまひとつ分かりにくいのがURIではないでしょうか。

URLという用語はよく出てきますが、URIはあまり耳にすることはないかもしれませんが、URIはURLを包括する用語であり、ほぼ同意と考えても支障はありません。

では、名前空間をあらわすために使用しているそのURIにはどんな意味があるのでしょうか。

「http:」から始まるため、名前空間をあらわすために指定したURIから何か仕様やスキーマーを取得してくるようなイメージがあるかもしれませんが、そういったものではなく、前述したとおり、あくまで一意に定めるための識別子です。

ですので、名前空間をあらわすに指定するURIは、はっきりいって適当でも良いのです。例えば、会社内でしか使用しないXML文書であれば、その中で重複しなければ問題はありません。ただ、WebのURIはこの世に重複はありませんので、会社や個人が所持しているURIを識別子と指定すれば固有の名前空間を定義できます。

もちろん、そのURIにXML Schema自身や関連するドキュメントが保存されていても問題ありません。(むしろ、それが推奨されています。)