以前に org.dom4j.Element クラス用に NamespaceContext のサブクラスを定義して、AspectJ を用いてその取得用のメソッドを織り込むということをやりました(一覧)。 新に作成した AbstractCompositeNamespaceContext クラスを用いて、同様のことをやっておきましょう。 ただし、AspectJ を用いた織り込みは省略。
// import 分は省略。 /** @author waman */ public class Dom4jNamespaceContext extends AbstractCompositeNamespaceContext { private final Element element; public Dom4jNamespaceContext(Element element){ this.element = element; } @Override protected NamespaceContext getParentContext() { Element parent = this.element.getParent(); if(parent == null) return EmptyNamespaceContext.INSTANCE; else return parent.getNamespaceContext(); } @Override protected String getNamespaceURILocally(String prefix) { for(Object obj: this.element.declaredNamespaces()){ Namespace ns = (Namespace)obj; if(ns.getPrefix().equals(prefix)) return ns.getNamespaceURI(); } return null; } @Override protected Set<String> getPrefixSetLocally(String uri) { Set<String> prefixes = new HashSet<String>(); for(Object obj: this.element.declaredNamespaces()){ Namespace ns = (Namespace)obj; if(ns.getNamespaceURI().equals(uri)) prefixes.add(ns.getPrefix()); } return prefixes; } }
まぁ、特に変わりはないですね。