Hatena::ブログ(Diary)

cooldaemonの備忘録 RSSフィード

2009-05-05

libxml2 の SAX インターフェースを試してみた

Source はこちら

iPhone アプリの開発中に XML をパースしたくなったのだけれど、サンプルコードの XML Performance をコンパイルして実行してみると、libxml2 の SAX インターフェースを使った方が、NSXMLParser を使うより三倍以上早かったので、libxml2 を使う事にした。

NSXMLParser も内部で libxml2 を利用しているが、libxml2 を直接使う場合、xmlCreatePushParserCtxt() で作ったパーサーコンテキストに対して xmlParseChunk() を使い、ダウンロード中の XML を少しずつ追加しながらパースを行うという芸当が可能な為、速度が早い。

ただし、XML ではなく HTML をパースする場合、かつ、HTML_PARSE_RECOVER などのオプションを指定したい場合、一度 DOM ツリーを作成する必要がある為、残念ながら SAX インターフェースは使えない(本当かな?識者の突っ込み希望)ので、NSXMLParser を使った方が良いのかな?

NSXMLParser は SAX 専用である為、オプションを指定する場合は、DOM 専用の NSXMLDocument を使う必要がある。オプションの種類は この辺を参照の事。

ちなみに、SAX のコールバック関数を登録する際に下記のようにした。

SAXHander.initialized = XML_SAX2_MAGIC;

これを登録しておかないと、SAX2 用のコールバック関数を呼んでくれない。(これで少しハマった orz)