2005年10月25日

StAXでXML

現在、JavaでXMLをいじろうとすると二つの方法がある。
SAX(Simple API for XML)とDOM(Document Object Model)だ。

DOMは欲しい情報だけ取得できて便利だが、一度にすべてのデータを読み込みデータ構造をメモリに持つのでメモリの消費が激しい。
SAXは文字通りシンプルでメモリ消費も少ないが複雑なXMLを処理しようと思うとプログラマの負担が大きい。

それぞれの弱点を考慮し、この二つの良いトコ取りをした新しいAPIがStAX(Streaming API for XML)だ。

と言うところまではよく聞く話だが実際よくわからなかったので使ってみた。

とりあえずこの辺からライブラリを入手。

しかしStAX!StAX!って聞く割には情報がない・・・。
StAX XMLで日本語ページを検索しても1000件ぐらいしかヒットしないし・・・。ヘッドフォンのSTAXもガンガンヒットする。

とりあえずJavaWorldにあったサンプルで試してみる。
StAXにはCursor APIとEvent Iterator APIの二つがあるらしい。
そして今回はCursor APIを使ってXMLを読み込む。

// 初期化
XMLInputFactory f = XMLInputFactory.newInstance();
XMLStreamReader r = f.createXMLStreamReader( filename , new FileInputStream(filename));
while( r.hasNext() ){
	r.next();
	// r.getText()やらr.getEventType()やらする
}

おお、すげー簡単。SAXよりもシンプルなんではなかろうか。
しかしあまりにシンプルすぎてこれではプログラマの負担がSAXと変わらない気が・・・・。
まぁ確かになじみの深いIteratorのように使えるからイベント駆動のSAXよりかは使いやすそうだが。

Cursor APIと言う名前の通り最初から1エレメントずつ読み込んでいく感じでSAXに対する別の解なのかもしれない。書き込みもできるのでSAX使うならこっちかなぁって感じ。


Event Iterator APIも気になったので調べてみた。StAX Event Iterator APIでググると日本語の情報8件・・・。頑張れStAX。仕方なく英語の情報で探す。この辺とか。
XMLEventReader r = f.createXMLEventReader( filename , new FileInputStream(filename));
するだけでEventReaderが取得できる。
後はCursor APIと同じようにr.nextEvent()すればXMLEventが取得できる。

・・・、ってそれだけ?
Cursor APIを通して取得できる情報がXMLEventと言う形でまとまってボコッと取得できるぐらいの差しかないのかな・・・。

SAXとDOMには弱点があるからStAXを作ったぜ!みたいな前評判(?)だったのでちょっと興味があったが俺が期待していたようなモノではなかったようだ。
DOMの代わりにはならないがSAXの代わりとしては便利そうな予感。むしろSAX要らないかも。
巨大なXMLファイルを書き込む必要があるならStAXしかないと言う場合もありそうだ。

ちなみに300バイト程度のXMLファイルを読み込むのに200~250ミリ秒かかっていた。
XMLInputFactoryのインスタンスの取得に100ミリ秒。
XMLStreamReaderのインスタンスの取得に100ミリ秒。
このあたりはDOMやSAXと同じぐらいだろうか。
読み込みが開始すれば速いが、小さなXMLファイルを大量に読み込む必要がある場合はちょっと遅いかもしれない。

Trackback on "StAXでXML"

このエントリーのトラックバックURL: 

"StAXでXML"へのトラックバックはまだありません。

Comment on "StAXでXML"

"StAXでXML"へのコメントはまだありません。