2010年1月24日日曜日

Xpath使うときによく使う個人的なclass……PersonalNamespaceContext

Xpathを使う時に使うNamespaceContextの拡張版のclass。多分誰でも考えつくとは思うが、これによって幾らでも必要な名前空間(Namespace)を追加出来る。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
public class PersonalNamespaceContext implements NamespaceContext {
Map<String,String> pre=new HashMap<String,String>();
/**
* ネームスペースをセットする関数
* @param prefix 名前空間接頭辞
* @param uri 統一資源識別子
* @return
*/
public String setNameSpaceURI(String prefix,String uri){
return pre.put(prefix,uri);
}
public Map<String,String> setNameSpaceURIs(Map<String,String> am){
pre.putAll(am);return am;
}
public String getNamespaceURI(String prefix) {
String s=pre.get(prefix);
return s!=null?s:XMLConstants.NULL_NS_URI;
}
public String getPrefix(String uri) {
throw new UnsupportedOperationException();
}
public Iterator<?> getPrefixes(String uri) {
throw new UnsupportedOperationException();
}
}

使う時は以下の様な感じに使うと良い。

XPathFactory factory = XPathFactory.newInstance();
Xpath xpath = factory.newXPath();
PersonalNamespaceContext _x=new PersonalNamespaceContext();
_x.setNameSpaceURI("b","http://juner.net/data");
xpath.setNamespaceContext(_x);

setNameSpaceURIを使うことで動的に追加することが可能となる。まぁprivateなclass作る方が楽かも知れぬがこういう方法も有りということで。