パスワードを忘れた? アカウント作成
551759 journal

A7Mの日記: 覚え書き:libxml2のSAXの使い方その2(Streaming API)

日記 by A7M
このネタコメントをくれたACさんがlibxml2にStreaming APIがあると紹介してくれたので、試してみた。

#include <libxml/xmlreader.h>

void processNode(xmlTextReaderPtr reader)
{
    int Type = xmlTextReaderNodeType(reader);
    if (Type == XML_READER_TYPE_ELEMENT) {
        // 要素の開始
        xmlChar* name = xmlTextReaderName(reader);
        xmlFree(name);
    } else if (Type == XML_READER_TYPE_END_ELEMENT) {
        // 要素の終了
    } else if (Type == XML_READER_TYPE_TEXT) {
        // 文字列
        xmlChar* val = xmlTextReaderValue(reader);
        xmlFree(val);
    }
}

int main(int argc, char* argv[])
{
    xmlTextReaderPtr reader;
    reader = xmlNewTextReaderFilename("foo.xml");
    ret = xmlTextReaderRead(reader);
    while (ret == 1) {
        processNode(reader);
        ret = xmlTextReaderRead(reader);
    }
    xmlFreeTextReader(reader);
}

xmlTextReaderをxmlNodeに変換できるので、部分的にDOMでパースすることも可能。
何故か手元にある1GB近いXMLファイルも問題なくパースできた。
ぶっちゃけ、xmlSAXHandlerよりエレガントだ。

AC様ありがとうございます。m(__)m

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

にわかな奴ほど語りたがる -- あるハッカー

読み込み中...