NamespaceContextの実装J2SE5に標準だと含まれてないっぽいNamespaceContextの実装。XPathを使うときに便利なように。
package foobar;
import java.util.HashMap;
import java.util.Iterator;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
public class NamespaceContextImpl implements NamespaceContext {
private HashMap list = new HashMap();
public NamespaceContextImpl() {
init();
}
public NamespaceContextImpl(HashMap map) {
list.putAll(map);
init();
}
private void init() {
registerNamespace(XMLConstants.XML_NS_PREFIX, XMLConstants.XML_NS_URI);
registerNamespace(XMLConstants.XMLNS_ATTRIBUTE, XMLConstants.XMLNS_ATTRIBUTE_NS_URI);
}
public void registerNamespace(String prefix, String nsUri) throws IllegalArgumentException{
if (prefix == null || nsUri == null) {
throw new IllegalArgumentException();
}
list.put(prefix, nsUri);
}
public String getPrefix(String nsUri) throws IllegalArgumentException {
if (nsUri == null) {
throw new IllegalArgumentException();
}
Iterator prefixIt = list.keySet().iterator();
while (prefixIt.hasNext()) {
String prefix = prefixIt.next().toString();
if (list.get(prefix).toString().equals(nsUri)) {
return prefix;
}
}
return null;
}
public String getNamespaceURI(String prefix) throws IllegalArgumentException {
if (prefix == null) {
throw new IllegalArgumentException();
}
if (list.containsKey(prefix)) {
return list.get(prefix).toString();
} else {
return XMLConstants.NULL_NS_URI;
}
}
public Iterator getPrefixes(String nsUri) throws IllegalArgumentException {
if (nsUri == null) {
throw new IllegalArgumentException();
}
HashMap cList = (HashMap) list.clone();
Iterator prefixIt = cList.keySet().iterator();
while (prefixIt.hasNext()) {
String prefix = prefixIt.next().toString();
if (! cList.get(prefix).toString().equals(nsUri)) {
cList.remove(prefix);
}
}
return cList.keySet().iterator();
}
}
NamespaceContext自体には接頭辞と名前空間URIの対応を追加するメソッドが定義されていないので、適当に足しておいた。Java初心者なので変なところがあったらごめんなさい。
NamespaceContextImpl nsCtxt = new NamespaceContextImpl();
nsCtxt.registerNamespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
XPath xp = XPathFactory.newInstance().newXPath();
xp.setNamespaceContext(nsCtxt);