倭マン's BLOG

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

QName を使った SAX イベント・ハンドラ (3) : 実装クラス

今回は、前回作成したの2つのインターフェースの実装クラス JDefaultHandler, JAttributesImpl クラスを作成します。

JDefaultHandler クラス


JDefaultHandler は org.xml.sax.helpers.DefaultHandler を拡張して作成します。 各メソッドの実装の概要は以下の通り:

  • org.xml.sax.ContentHandler に定義されている startElement(), endElement() メソッドは、QName オブジェクトを引数にとるメソッドに処理を委譲する。
  • QName オブジェクトを引数にとるstartElement(), endElement() メソッドは何も処理をしない。

実際の実装はこんな感じ:

import javax.xml.namespace.QName;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class JDefaultHandler extends DefaultHandler implements JContentHandler{

    @Override
    public final void startElement(String uri, String name, String qname, Attributes atts) 
            throws SAXException {
        startElement(newQName(uri, name, qname), new JAttributesImpl(atts));
    }
    
    @Override
    public final void endElement(String uri, String name, String qname)
            throws SAXException {
        endElement(newQName(uri, name, qname));
    }

    public void startElement(QName qname, JAttributes atts)throws SAXException{}
    public void endElement(QName qname)throws SAXException{}
}

newQName(String, String, String) メソッドの実装は「名前空間 URI」「ローカル名」「QName(文字列)」から javax.xml.namespace.QName オブジェクトを生成するユーティリティ・メソッドです。 このメソッドは JAttributesImpl でも使用するので、実際にはユーティリティ・クラスを作成してそこに定義する方がよいでしょう。 JAttributesImpl については次節。

JAttributesImpl クラス


JAttributesImpl は org.xml.sax.helpers.AttributesImpl クラスを拡張 して作成します。 新たに定義するメソッドは JAttributes インターフェースに定義したメソッドと、QName を用いて属性値などを設定するメソッド(addAttribute(), setAttribute() メソッド)です。 これらのメソッドの実装は、QName オブジェクトから名前空間 URI やローカル名を取得し、それらを用いて他のメソッドを呼び出しているだけです:

import javax.xml.namespace.QName;
import org.waman.tools.xutil.QNameUtils;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.AttributesImpl;

public class JAttributesImpl 
        extends AttributesImpl implements JAttributes{
    
    public static final String DEFAULT_TYPE = "CDATA";
    
    public JAttributesImpl() {super();}
    public JAttributesImpl(Attributes atts) {super(atts);}

    public QName getQualifiedName(int i) {
        return new QName(getURI(i), getLocalName(i), getQName(i));
    }

    public int getIndex(QName qname) {
        return getIndex(qname.getNamespaceURI(), qname.getLocalPart());
    }

    public String getType(QName qname) {
        return getType(qname.getNamespaceURI(), qname.getLocalPart());
    }

    public String getValue(QName qname) {
        return getValue(qname.getNamespaceURI(), qname.getLocalPart());
    }

    public void addAttribute(QName qname, String value) {
        addAttribute(qname, DEFAULT_TYPE, value);
    }

    public void addAttribute(QName qname, String type, String value) {
        addAttribute(
                qname.getNamespaceURI(), 
                qname.getLocalPart(),
                QNameUtils.toPrefixedName(qname), 
                type,
                value);
    }
    
    public void setAttribute(int index, QName qname, String value) {
        setAttribute(index, qname, DEFAULT_TYPE, value);
    }

    public void setAttribute(int index, QName qname, String type, String value) {
        setAttribute(
                index,
                qname.getNamespaceURI(), 
                qname.getLocalPart(),
                QNameUtils.toPrefixedName(qname), 
                type,
                value);
    }
}

QNameUtils.toPrefixedName() メソッド以前の記事で書いたメソッドです。 以上で完了。