倭マン's BLOG

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

Jaxen 苦闘 (5) :Jaxen と名前空間コンテキスト

今回は、前回見た「名前空間コンテキストの設定」に関連するインターフェース、クラスをもう少し詳しく見ていきます(記事一覧)。

  • org.jaxen.XPath に定義されている NamespaceContext 関連のメソッド
  • org.jaxen.NamespaceContext インターフェース
  • org.jaxen.SimpleNamespaceContext クラス

org.jaxen.XPath オブジェクトに定義されている名前空間コンテキスト関連のメソッド


まずは XPath インターフェースに定義されているメソッド。 このインターフェースには NamespaceContext プロパティに対するアクセッサメソッド (getNamespaceContext(), setNamespaceContext()) と、直接接頭辞と名前空間 URI を設定する addNamespace() メソッドが定義されています:

package org.jaxen;

public interface XPath{
    ...
    void addNamespace(String prefix, String uri);
    NamespaceContext getNamespaceContext();
    void setNamespaceContext(NamespaceContext namespaceContext);
    ...
}

setNamespaceContext(), addNamespace() メソッドは前回出てきました。

org.jaxen.NamespaceContext インターフェース


NamespaceContext インターフェースは、(文字列の)XPath 式に含まれている QName に対して、その接頭辞から名前空間 URI を取得する際に用います。

定義されているメソッドは1つだけです:

package org.jaxen;

public interface NamespaceContext{
    String translateNamespacePrefixToUri(String prefix) ;
}

この NamespaceContext インターフェースは javax.xml.namespace.NamespaceContext と同じような役割をします。 ただし、 「接頭辞 → 名前空間 URI」の変換をするメソッド translatenamespacePrefixToUri() しか定義されていません:

  • org.jaxen.NamespaceContext#translateNamespacePrefixToUri(String prefix)
  • javax.xml.namespace.NamespaceContext#getNamespaceURI(String prefix)

ただし、引数の接頭辞が特定の値を持つ場合に返される名前空間 URI の値が少々異なる定義をされています。

getNamespaceURI() に関しては以前の記事を参照して下さい。

translateNamespacePrefixToUri() に関しては

接頭辞 返り値(名前空間 URI
"" null
"xml" "http://www.w3.org/XML/1998/namespace"
定義されている接頭辞 対応する名前空間 URI
定義されていない接頭辞 null

と定義されています。 接頭辞が空文字列の場合、(デフォルト名前空間URI ではなく)null が返される点が getNamespaceURI() と異なります。

org.jaxen.SimpleNamespaceContext クラス


SimpleNamespaceContext は NamespaceContext の(デフォルトで定義されている唯一の)実装クラスです。

実装方法は概ね、接頭辞と名前空間 URI のセットをエントリーとして保持するマップと思えばよいでしょう。 NamespaceContext からオーバーライドされているメソッド translateNamespacePrefixToUri() 以外に、エントリー(接頭辞と名前空間 URI のセット)を登録するメソッド addNamespace() が定義されています。

package org.jaxen;

public class SimpleNamespaceContext implements NamespaceContext{

    public SimpleNamespaceContext(){...}
    public SimpleNamespaceContext(java.util.Map namespaces) {...}

    @Override public String translateNamespacePrefixToUri(String prefix){...}
    public void addNamespace(String prefix, String URI){...}
    public void addElementNamespaces(org.jaxen.Navigator nav, Object element){...}
}