pugixml是一款基于C++开发的轻量级XML解析库,它不需要依赖其他第三方库,仅通过头文件和源文件即可集成到项目中,支持XML文档的解析、修改、生成等完整操作,非常适合嵌入式场景或性能要求较高的C++项目使用。

pugixml库的环境配置
首先需要从pugixml的官方渠道获取库文件,下载完成后会得到pugixml.hpp头文件和pugixml.cpp源文件。将这两个文件添加到你的C++项目目录中,在需要使用的代码文件里包含头文件即可完成配置。
#include <iostream>
#include "pugixml.hpp"
int main() {
// 后续操作示例
return 0;
}
加载XML文档
pugixml支持从文件、内存字符串、标准输入流等多种方式加载XML文档,最常用的是从本地文件加载。
从文件加载XML
使用xml_document类的load_file方法即可加载本地XML文件,该方法会返回加载结果的状态码,我们可以通过状态码判断加载是否成功。
#include <iostream>
#include "pugixml.hpp"
int main() {
pugi::xml_document doc;
// 加载当前目录下的test.xml文件
pugi::xml_parse_result result = doc.load_file("test.xml");
if (result) {
std::cout << "XML文件加载成功" << std::endl;
} else {
std::cout << "XML文件加载失败,错误描述:" << result.description() << std::endl;
}
return 0;
}
从字符串加载XML
如果需要解析内存中已有的XML格式字符串,可以使用load_string方法。
#include <iostream>
#include "pugixml.hpp"
int main() {
pugi::xml_document doc;
const char* xml_str = "<?xml version="1.0"?><root><item id="1">测试内容</item></root>";
pugi::xml_parse_result result = doc.load_string(xml_str);
if (result) {
std::cout << "XML字符串加载成功" << std::endl;
}
return 0;
}
遍历XML节点
加载完成XML文档后,我们可以通过节点遍历的方式获取需要的内容,pugixml提供了多种节点遍历方式。
获取根节点
使用document_element方法可以获取XML文档的根节点,后续的所有节点操作都基于根节点展开。
#include <iostream>
#include "pugixml.hpp"
int main() {
pugi::xml_document doc;
doc.load_string("<?xml version="1.0"?><root><item>内容1</item><item>内容2</item></root>");
// 获取根节点
pugi::xml_node root = doc.document_element();
std::cout << "根节点名称:" << root.name() << std::endl;
return 0;
}
遍历子节点
可以通过child方法获取指定名称的子节点,也可以通过迭代的方式遍历所有子节点。
#include <iostream>
#include "pugixml.hpp"
int main() {
pugi::xml_document doc;
doc.load_string("<?xml version="1.0"?><root><item>内容1</item><item>内容2</item></root>");
pugi::xml_node root = doc.document_element();
// 遍历所有名为item的子节点
for (pugi::xml_node item : root.children("item")) {
std::cout << "子节点内容:" << item.text().get() << std::endl;
}
return 0;
}
读取节点属性
XML节点的属性可以通过attribute方法获取,支持按属性名读取,也支持遍历所有属性。
#include <iostream>
#include "pugixml.hpp"
int main() {
pugi::xml_document doc;
doc.load_string("<?xml version="1.0"?><root><item id="100" name="测试项">内容</item></root>");
pugi::xml_node item = doc.document_element().child("item");
// 读取id属性
pugi::xml_attribute id_attr = item.attribute("id");
if (id_attr) {
std::cout << "id属性值:" << id_attr.value() << std::endl;
// 也可以直接转成整数类型
int id = id_attr.as_int();
std::cout << "id转整数:" << id << std::endl;
}
// 遍历所有属性
for (pugi::xml_attribute attr : item.attributes()) {
std::cout << "属性名:" << attr.name() << ",属性值:" << attr.value() << std::endl;
}
return 0;
}
修改与新增XML内容
pugixml不仅支持解析XML,还支持修改现有节点内容、新增节点和属性,最后可以将修改后的文档保存到文件或字符串中。
修改节点内容和属性
#include <iostream>
#include "pugixml.hpp"
int main() {
pugi::xml_document doc;
doc.load_string("<?xml version="1.0"?><root><item id="1">旧内容</item></root>");
pugi::xml_node item = doc.document_element().child("item");
// 修改节点文本内容
item.text().set("新内容");
// 修改属性值
item.attribute("id").set_value("2");
std::cout << "修改后的节点内容:" << item.text().get() << std::endl;
std::cout << "修改后的id属性:" << item.attribute("id").value() << std::endl;
return 0;
}
新增节点和属性
#include <iostream>
#include "pugixml.hpp"
int main() {
pugi::xml_document doc;
// 创建XML声明
doc.append_child(pugi::node_declaration).set_name("xml");
doc.child("xml").set_attribute("version", "1.0");
// 创建根节点
pugi::xml_node root = doc.append_child("root");
// 新增子节点
pugi::xml_node new_item = root.append_child("item");
// 新增子节点文本内容
new_item.text().set("新增的内容");
// 新增属性
new_item.append_attribute("id") = "3";
new_item.append_attribute("name") = "新增项";
// 保存修改后的文档到字符串
std::string xml_str;
doc.save(xml_str);
std::cout << "生成的XML内容:" << std::endl;
std::cout << xml_str << std::endl;
return 0;
}
常见使用注意事项
- 加载XML文件时需要确保文件路径正确,相对路径是相对于程序运行目录的
- 读取节点或属性前最好先判断是否存在,避免出现空指针访问的问题
- pugixml的节点和属性对象都是轻量级的引用类型,不需要手动释放内存,文档对象销毁时会自动释放所有资源
- 如果需要处理大型XML文件,建议使用流式解析方式,避免一次性加载占用过多内存
pugixmlC++XML解析轻量级_xml解析器修改时间:2026-07-15 13:12:41