倭マン's BLOG

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

8. javax.xml.transform とのブリッジ (2) : Result

前回に引き続き、javax.xml.transform パッケージとのブリッジを考えます。 今回は javax.xml.transform.Result インターフェース。

XMLEventResult


まず、XMLEventResult クラスのサンプルコード。 XMLEventResult クラスは Result のサブタイプです。

public void someMethod(XMLEventHandler handler){
    Result result = new XMLEventResult(handler);
    ...
}

コールバック処理を実装した XMLEventHandler オブジェクトをコンストラクタの引数にして Result オブジェクトを生成しています。 javax.xml.transform.SAXResult と同じような使い方です(SAXResult は org.xml.sax.ContentHandler をコンストラクタの引数にするのでした)。

では、このクラスの実装を考えていきましょう。

XMLEventResult の実装


XMLEventResult クラスも XMLEventSource クラスと同様に、既にあるクラスを利用して実装を行いましょう。 ここで使用するクラスは(先ほど使い方が同じようなと言った)SAXResult クラスです。

XMLEventSource ではプル・パース型の StAXSource を用いましたが、ここではプッシュ・パース型の SAXResult を用いているのに注意(するほどでもないかな)。 SAXHandler は org.xml.sax.ContentHandler を実装したクラスで、後ほど詳しくみていきます。

package xmlparsing.transform;

import javax.xml.transform.sax.SAXResult;
import xmlparsing.XMLEventHandler;
import xmlparsing.sax.SAXHandler;

public class XMLEventResult extends SAXResult{

    public XMLEventResult(XMLEventHandler handler){
        super(new SAXHandler(handler));
    }
}

SAXHandler


これは org.xml.sax.ContentHandler を実装し、その処理を XMLEventHandler へ委譲するクラスです。 以前に作成した SAX とのブリッジクラス SAXEventHandler とは委譲 (?) の仕方が逆です:

  • SAXHandler (implements ContentHandler) : ContentHandler → XMLEventHandler
  • SAXEventHandler (implements XMLEventHandler) : XMLEventHandler → ContentHandler

SAXHandler の実装は以下のようになります(ContentHandler を実装するためのヘルパークラス org.xml.sax.helpers.DefaultHandler を用いています):

package xmlparsing.sax;

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import xmlparsing.XMLEventHandler;
import xmlparsing.events.*;

public class SAXHandler extends DefaultHandler implements ContentHandler{
    
    private final XMLEventHandler handler;
    
    public SAXHandler(XMLEventHandler handler){
        this.handler = handler;
    }

    @Override
    public void startDocument() throws SAXException {
        this.handler.startDocument(new StartDocument());
    }

    @Override
    public void endDocument() throws SAXException {
        this.handler.endDocument(new EndDocument());
    }

    @Override
    public void startElement(String uri, String localName, String name, Attributes attributes)
            throws SAXException {
        this.handler.startElement(new StartElement(localName));
    }

    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {
        this.handler.endElement(new EndElement(localName));
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        this.handler.text(new Text(String.valueOf(ch, start, length)));
    }
}

まぁ、何てことはありませんね。