倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

名前空間とQName

dom4j の連載で名前空間と QName についてあまり触れなかったので、ここで簡単な使い方を(一覧)。

Namespace


org.dom4j.Namespace名前空間(宣言)ノードを表すクラスです。 Namespace オブジェクト(通常の XML 文書の名前空間ノードも)のイメージは、簡単に言ってしまえば「接頭辞」と「名前空間 URI」 のセットです。 このクラスは、XML 文書のノードを抽象化した dom4jJava モデルの中で、唯一インターフェースでない型です(以前の記事参照)。 また、親要素を持ちません(Namespace#getParent() メソッドは null を返します)。

用途・使い方

Namespace は名前空間を指定するために使いますが、大抵、後で出てくる 「QName のインスタンスを取得する」のに使います。 また、要素中に現れる「名前空間宣言」を表す際にも用いられます。 Namespace に定義されている getter メソッドは下表の通り:

メソッド 返り値 備考
getPrefix() java.lang.String 接頭辞を返す。
getURI() java.lang.String 名前空間 URI を返す。

インスタンスの取得

Namespace はクラスなので、コンストラクタを用いてインスタンスを生成することが出来ます。 ただし、「接頭辞」と「名前空間 URI」が同じ Namespace オブジェクトを重複して作成しないように、通常は Namespace クラスの static メソッド Namespace#get() を用いてインスタンスを取得します:

// 接頭辞を付けない場合
Namespace nsWithoutPrefix = Namespace.get("http://relaxng.org/ns/structure/1.0");

// 接頭辞を付ける場合
Namespace nsWithPrefix = Namespace.get("rng", "http://relaxng.org/ns/structure/1.0");

接頭辞を付ける場合は、引数の順番に気をつけましょう。 第0引数が「接頭辞」、第2引数が「名前空間 URI」です。

QName


org.dom4j.QName は QName (qualified name) を表すクラスです。 QName とは、概ね「名前」と「名前空間URI)」をセットにしたものです。 QName は XML 文書のノードを抽象化したものではありません。

用途・使い方

QName は要素(org.dom4j.Element)と属性(org.dom4j.Attribute)の名前を名前空間を有効にして扱う際に使用します。 QName に定義されている getter メソッドは下表の通り:

メソッド 返り値 備考
getName() java.lang.String ローカル名(接頭辞を除いた名前)を返す。
getNamespace() org.dom4j.Namespace 名前空間を返す。
getNamespacePrefix() java.lang.String 名前空間の接頭辞を返す。
getNamespaceURI() java.lang.String 名前空間 URI を返す。
getQualifiedName() org.dom4j.QName QName を返す。

インスタンスの取得

QName はクラスなので、コンストラクタを用いてインスタンスを生成できますが、Namespace 同様 static メソッド QName#get() を用いてインスタンスを取得するのが普通です。 このメソッドには幾つかのシグニチャ(引数の数と型)があります:

  • QName.get(String name);
  • QName.get(String qname, String uri);
  • QName.get(String name, String prefix, String uri);
  • QName.get(String name, Namespace ns);
  • QName.get(String localName, Namespace ns, String qname);

ソースコード読むのが面倒なので、引数にいろいろ渡した結果(をもとに生成した要素)を載せておきます。

QName#get() : 引数が java.lang.String のみの場合

引数の個数 ソースコード 結果
1 QName.get("name");
1 QName.get("abc:name");
2 QName.get("start", "uri");
2 QName.get("pre:name", "uri");
3 QName.get("name", "rng", "uri");
3 QName.get("pre:name", "rng", "uri");

QName#get() : 引数に org.dom4j.Namespace を含む場合

以下では、「Namespace ns = Namespace.get("pre", "uri")」としてます:

引数の個数 ソースコード 結果
2 QName.get("name", ns);
2 QName.get("pre:name", ns);
3 QName.get("name", ns, "pre:name");
3 QName.get("name", ns, "p:name");
3 QName.get("pre:name", ns, "pre:name");

DocumentFactory と XPath に使用する名前空間の登録


dom4j では、XPath をシームレスに使えるのが1つのウリですが、XPath 式で接頭辞によって名前空間を指定するためには、少々コーディングが必要です。 これをするためには

  1. org.dom4j.DocumentFactory オブジェクトを生成して、
  2. setXPathNamespaceURIs(Map) メソッドによって接頭辞と名前空間 URI の組を登録し、
  3. その DocumentFactory オブジェクトから Document や Element を生成する

という手順を踏みます。 詳しくはまたの機会に。