dom4j の連載で名前空間と QName についてあまり触れなかったので、ここで簡単な使い方を(一覧)。
Namespace
org.dom4j.Namespace は名前空間(宣言)ノードを表すクラスです。 Namespace オブジェクト(通常の XML 文書の名前空間ノードも)のイメージは、簡単に言ってしまえば「接頭辞」と「名前空間 URI」 のセットです。 このクラスは、XML 文書のノードを抽象化した dom4j の Java モデルの中で、唯一インターフェースでない型です(以前の記事参照)。 また、親要素を持ちません(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 式で接頭辞によって名前空間を指定するためには、少々コーディングが必要です。 これをするためには
- org.dom4j.DocumentFactory オブジェクトを生成して、
- setXPathNamespaceURIs(Map) メソッドによって接頭辞と名前空間 URI の組を登録し、
- その DocumentFactory オブジェクトから Document や Element を生成する
という手順を踏みます。 詳しくはまたの機会に。