libxml2是一个功能强大的XML解析库,可以用于读取和写入XML文件。以下是一些基本的例子来展示如何使用libxml2进行读写操作。
写文件
在这个例子中,我们首先创建一个新的XML文档,并设置一个根节点。然后,我们创建两个新的节点,并将它们添加到根节点。最后,我们将这个XML文档保存到一个文件output.xml中。
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h> int xml_write(void) { xmlDocPtr doc = NULL; xmlNodePtr root_node = NULL, node = NULL, node1 = NULL; LIBXML_TEST_VERSION doc = xmlNewDoc(BAD_CAST "1.0"); root_node = xmlNewNode(NULL, BAD_CAST "root"); xmlDocSetRootElement(doc, root_node); node = xmlNewNode(NULL, BAD_CAST "node1"); xmlNodeSetContent(node, BAD_CAST "content of node1"); xmlAddChild(root_node, node); node1 = xmlNewNode(NULL, BAD_CAST "node2"); xmlNodeSetContent(node1, BAD_CAST "content of node2"); xmlAddChild(root_node, node1); int nRel = xmlSaveFormatFileEnc("output.xml", doc, "UTF-8", 1); if (nRel != -1) printf("An XML file is created successfully.\n"); xmlFreeDoc(doc); xmlCleanupParser(); return 0;
}
执行后创建的文件:
<?xml version="1.0" encoding="UTF-8"?>
<root><node1>content of node1</node1><node2>content of node2</node2>
</root>
读文件
在这个例子中,我们首先读取一个XML文件,并获取其根元素。然后,我们遍历XML文档的所有节点,并打印出它们的名称。最后,我们释放XML文档并清理解析器。
注意:在运行这些代码之前,你需要确保已经安装了libxml2库,并且在编译代码时需要链接这个库。例如,如果你使用gcc编译器,你可以这样编译代码:
gcc your_code.c -o your_program -lxml2
。
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h> void print_element_names(xmlNode * a_node) { xmlNode *cur_node = NULL; for (cur_node = a_node; cur_node; cur_node = cur_node->next) { if (cur_node->type == XML_ELEMENT_NODE) { printf("node type: Element, name: %s\n", cur_node->name); printf("node type: Element, content: %s\n", cur_node->content); const xmlChar* content = xmlNodeGetContent(cur_node);printf("content: %s\n", content);} print_element_names(cur_node->children); }
} int xml_read(void) { xmlDoc *doc = NULL; xmlNode *root_element = NULL; char *file_name = "output.xml";doc = xmlReadFile(file_name, NULL, 0); if (doc == NULL) { printf("error: could not parse file %s\n", file_name); exit(-1); } root_element = xmlDocGetRootElement(doc); print_element_names(root_element); xmlFreeDoc(doc); xmlCleanupParser(); return 0;
}
在测试主函数中调用xml_read完成测试,测试结果如下:由测试结果可知,直接访问cur_node->content指针返回的是空的值,使用xmlNodeGetContent函数会返回所有子节点的值,所以在具体使用时,要添加一些节点的判断,以保证获取到需要的值。