C言語libxml2でXMLドキュメントを生成して文字列として取得する

C言語からlibxml2ライブラリを利用して、メモリ上で作成したXMLドキュメントをXML文字列を生成するメモ。巷にはファイルからXMLを読み込んだり、XMLをファイルに書き出す例は多いですが、意外とメモリ上だけでXMLを扱った例が少なかったので、参考までに。

簡単な説明

XMLツリーの作成はtree系のメソッドで行う。

使う型はxmlDocPtrxmlNodePtrxmlCharぐらい。

関数も必須なのがxmlNewDocxmlNewNode, xmlDocSetRootElementで、属性の設定にxmlNewProp、子ノードの追加にxmlAddChild、文字列の取得にxmlDocDumpMemoryEncを使うぐらい。

あとはメモリ解放のためにxmlFreeDocxmlFreeを必ず使いましょう。

ソースコード

#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

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です