XML 文書の解析にはプッシュ・パース (push parsing) とプル・パース (pull parsing) ってのがあります。 通常、プッシュ・パースを行う API は SAX (org.xml.sax.**, javax.xml.parsers.*)、プル・パースを行う API は StAX (javax.xml.stream.**) を用います。
プッシュ・パースとプル・パースは、どちらが優れているかというより時と場合によって使い分けるのが良いのですが、SAX と StAX は仕様策定した機構が違うせいか少々勝手が違います。 ってなことで、プッシュ・パースとプル・パースを同じ枠組みの中で扱おうという試みを何度かにわたって行っていきます(一覧)。
StAX には「イベント API」と「カーソル API」というのがあって、実際に使うのは「カーソル API」の方でしょうが、ここでの試みは、StAX での「イベント API」と同様の方法で行っていきます。 ただし、「カーソル API」風に焼き直すのは大して難しくはないと思います。
XMLEventParser
今回は、解析を行うクラスを考えます。 このクラスを「XMLEventParser」としましょう。 このクラスでプッシュ・パースとプル・パースを行えるようにします。 クラスと解析メソッドの定義は以下のようにします:
package xmlparsing; import javax.xml.transform.Source; public class XMLEventParser { /** プッシュ・パース */ public void pushparse(Source source, XMLEventHandler handler){...} /** プル・パース */ public XMLEventIterator pullparse(Source source){...} }
- 入力は javax.xml.transform.Source。 InputStream や Reader と同じようなものと思ってもらって結構です。
- XMLEventHandler は SAX API での ContentHandler, LexicalHandler のような、コールバック処理を定義するインターフェース。
- XMLEventIterator は StAX API での XMLEventReader のような、XML イベントを列挙するインターフェース。
XMLEventHandler, XMLEventIterator の定義や使い方は次回以降。 StAX API では XMLEventParser に対応するようなインターフェース XMLEventReader 自体が XML イベントを列挙してましたが、ここでは少し変えてます。
次回は、実装例で用いる、簡単版 XML イベントのオブジェクト・モデルを。