A7Mの日記: 覚え書き:libxml2のSAXの使い方その2(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
覚え書き:libxml2のSAXの使い方その2(Streaming API) More ログイン