
测试环境:
vs2019
测试代码:
#include <iostream>
#include <string>
#include <libxml/parser.h>
#include <libxml/tree.h>
// 创建简单的XML文档
void createXmlDocument() {
// 创建新文档和根节点
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "root");
xmlDocSetRootElement(doc, root);
// 添加子节点
xmlNewChild(root, NULL, BAD_CAST "person", NULL);
xmlNodePtr person = xmlNewChild(root, NULL, BAD_CAST "person", NULL);
xmlNewProp(person, BAD_CAST "id", BAD_CAST "1");
// 添加带内容的子节点
xmlNewChild(person, NULL, BAD_CAST "name", BAD_CAST "John Doe");
xmlNewChild(person, NULL, BAD_CAST "age", BAD_CAST "30");
xmlNewChild(person, NULL, BAD_CAST "email", BAD_CAST "john@example.com");
// 保存到文件
xmlSaveFormatFileEnc("test.xml", doc, "UTF-8", 1);
// 释放资源
xmlFreeDoc(doc);
std::cout << "XML文档创建成功: test.xml\n";
}
// 解析XML文档
void parseXmlDocument(const char* filename) {
// 解析XML文件
xmlDocPtr doc = xmlReadFile(filename, NULL, 0);
if (doc == NULL) {
std::cerr << "无法解析XML文件: " << filename << std::endl;
return;
}
// 获取根节点
xmlNodePtr root = xmlDocGetRootElement(doc);
if (root == NULL) {
std::cerr << "空XML文档\n";
xmlFreeDoc(doc);
return;
}
std::cout << "\n解析XML文档: " << filename << "\n";
std::cout << "根节点: " << root->name << "\n";
// 遍历子节点
for (xmlNodePtr node = root->children; node != NULL; node = node->next) {
if (node->type == XML_ELEMENT_NODE) {
std::cout << "\n节点: " << node->name;
// 打印属性
for (xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next) {
std::cout << " | 属性: " << attr->name << "="
<< xmlGetProp(node, attr->name);
}
// 打印子节点内容
for (xmlNodePtr child = node->children; child != NULL; child = child->next) {
if (child->type == XML_TEXT_NODE && child->content != NULL) {
std::cout << "\n " << child->parent->name << ": " << child->content;
}
}
}
}
// 释放资源
xmlFreeDoc(doc);
}
int main() {
// 初始化libxml2库
xmlInitParser();
LIBXML_TEST_VERSION
// 创建XML文档
createXmlDocument();
// 解析刚创建的XML文档
parseXmlDocument("test.xml");
// 清理libxml2
xmlCleanupParser();
return 0;
}测试结果截图:
