指向性メモ::2005-05-16

ページ情報
制作日
2005-05-16T11:37:13+09:00
最終更新日
2005-05-16T11:37:13+09:00

NamespaceContextの実装

Created:
2005-05-16T11:37:13+09:00

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);
Comments
0
Trackbacks
0
PermaLink
http://yudai.arielworks.com/memo/2005/05/16/113713
連絡先、リンク、転載や複製などについては『サイト案内』をご覧ください。Powered by HIMMEL

I ♥ Validator