前回に引き続き、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))); } }
まぁ、何てことはありませんね。