DOM でXML 作成 (Libxml2)

DOMでXMLファイル書き出す。xmlNewDoc()でDOMの雛形をつくる。xmlNewNode()でノードを作成して、ルートノードからくっつけていく。

#include <stdio.h>
#include <libxml/tree.h>
#include <libxml/parser.h>

xmlNodePtr add_node(xmlNodePtr node,
                    char *node_name, char *text, char *attr, char *attr_var)
{
    xmlNodePtr new_node = NULL;
    xmlNodePtr new_text = NULL;

    /* Create node */
    new_node = xmlNewNode(NULL, node_name);

    /* Create text */
    if (NULL != text) {
        new_text = xmlNewText(text);
        xmlAddChild(new_node, new_text);
    }

    /* Set attribute */
    if (NULL != attr) {
        xmlNewProp(new_node, attr, attr_var);
    }

    /* Add node */
    xmlAddChild(node, new_node);

    return new_node;
}

int main(int argc, char **argv)
{
    xmlDocPtr   doc;
    xmlNodePtr  root_node = NULL;
    xmlNodePtr  new_node  = NULL;
    char       *output_file;
    int         ret;

    if (argc != 2) {
        return 1;
    }

    output_file = argv[1];

    LIBXML_TEST_VERSION;

    /* Create new document */
    doc = xmlNewDoc("1.0");

    /* Add root element */
    root_node = xmlNewNode(NULL, "cars");
    xmlDocSetRootElement(doc, root_node);

    /* Add node to root */
    new_node = add_node(root_node, "company", NULL, "name", "Car City Co., Ltd.");

    /* Add node to node1 */
    add_node(new_node, "product", "sports car", "ID", "001");
    add_node(new_node, "product", "motorcycle", "ID", "002");

    /* Add node to root */
    add_node(root_node, "company", NULL, "name", "Car Bank Co., Ltd.");

    /* Write document */
    ret = xmlSaveFormatFileEnc(output_file, doc, "UTF-8", 1);
    if (ret < 0) {
        fprintf(stderr, "Failed to save %s\n", output_file);
        return 1;
    }

    /* Free document */
    xmlFreeDoc(doc);

    xmlCleanupParser();

    return 0;
}

XML出力

<?xml version="1.0" encoding="UTF-8"?>
<cars>
  <company name="Car City Co., Ltd.">
    <product ID="001">sports car</product>
    <product ID="002">motorcycle</product>
  </company>
  <company name="Car Bank Co., Ltd."/>
</cars>

参考

The XML C parser and toolkit of Gnome
やさしいXML 第3版

やさしいXML 第3版

やさしいXML 第3版