C言語からlibxml2ライブラリを利用して、メモリ上で作成したXMLドキュメントをXML文字列を生成するメモ。巷にはファイルからXMLを読み込んだり、XMLをファイルに書き出す例は多いですが、意外とメモリ上だけでXMLを扱った例が少なかったので、参考までに。
簡単な説明
XMLツリーの作成はtree系のメソッドで行う。
使う型はxmlDocPtr
, xmlNodePtr
, xmlChar
ぐらい。
関数も必須なのがxmlNewDoc
, xmlNewNode
, xmlDocSetRootElement
で、属性の設定にxmlNewProp
、子ノードの追加にxmlAddChild
、文字列の取得にxmlDocDumpMemoryEnc
を使うぐらい。
あとはメモリ解放のためにxmlFreeDoc
とxmlFree
を必ず使いましょう。
ソースコード
#include <libxml/tree.h>
// 新しいノードの作成 + テキスト追加を行う関数
xmlNodePtr create_node(unsgined char *node_name, unsgined char *text)
{
xmlNodePtr new_node = NULL;
xmlNodePtr new_text = NULL;
new_node = xmlNewNode(NULL, node_name);
if (text != NULL) {
new_text = xmlNewText(text);
xmlAddChild(new_node, new_text);
}
return new_node;
}
// XMLドキュメントを作ってXML文字列を取得
int create_xml(unsigned char *ret) {
xmlDocPtr doc = xmlNewDoc("1.0"); // ドキュメント生成
xmlNodePtr root_node = create_node("RootNode", NULL); // ルートノード作成
xmlNewProp(root_node, "Version", "0.0.1"); // 属性追加
xmlDocSetRootElement(doc, root_node); // ルート要素設定
xmlNodePtr child_node = create_node("ChildNode", "I'm an only child."); // 子要素作成
xmlAddChild(root_node, child_node); // 子要素追加
xmlChar * buf; // XML文字列
int size; // XML文字列のサイズ
xmlDocDumpMemoryEnc(doc, &buf, &size, "UTF-8"); // UTF-8でXML文字列を取得
ret = strdup(buf); // 文字列をコピー
xmlFreeDoc(doc);
xmlFree(buf);
}
gccコンパイル時は-I/usr/include/libxml2 -lxml2
が必要です。
# gcc hogehoge.c -o hogehoge -I/usr/include/libxml2 -lxml2