pugixml 简介
pugixml 是一个非常经典且优秀的 C++ XML 处理库,适合用来学习项目结构和编写高效代码。它采用 MIT 许可证,允许在商业项目中自由使用、修改和分发。
核心特性
- DOM-like 接口:提供直观的方式来遍历、修改 XML 文档树。
- 极高的解析速度:非验证性 XML 解析器性能出色,适合性能敏感的场景。
- XPath 支持:内置了 XPath 1.0 的实现,可以执行复杂的数据查询。
- Unicode 支持:完美支持多种 Unicode 编码,并能自动处理编码转换。
由于其高效和易用的特性,它被广泛应用于各种项目中,例如 3D 模型导入库 Assimp、部分 Qt 模块,以及许多自定义的游戏引擎和工具链中。
环境配置
编译时需要包含以下头文件和库文件:
- 头文件:
pugiconfig.hpp,pugixml.hpp - 库文件:
pugixml.lib(Windows) /libpugixml.a(Linux/macOS)
代码示例
1. 加载与遍历
从文件加载 XML 并遍历所有节点。
#include <iostream>
#include "pugixml/pugixml.hpp"
int traverse_base() {
pugi::xml_document doc;
// 替换为实际存在的文件路径
if (!doc.load_file("config.xml")) return -1;
pugi::xml_node tools = doc.child("Profile").child("Tools");
for (pugi::xml_node tool = tools.first_child(); tool; tool = tool.next_sibling()) {
std::cout << "Tool:";
for (pugi::xml_attribute attr = tool.first_attribute(); attr; attr = attr.next_attribute()) {
std::cout << " " << attr.name() << "=" << attr.value();
}
std::cout << std::endl;
}
return 0;
}
2. XPath 查询
使用 XPath 语言快速定位复杂 XML 中的元素。
int xpath_query() {
pugi::xml_document doc;
if (!doc.load_file("config.xml")) return -1;
// 选择单个节点
pugi::xpath_node tool = doc.select_node("//tool[@id='1']");
// 选择节点集
pugi::xpath_node_set tools = doc.select_nodes("//tool[@timeout>0]");
// 遍历结果
for (auto& node : tools) {
std::cout << "Found tool: " << node.node().name() << std::endl;
}
return 0;
}
3. 修改文档
添加/删除节点和属性,并保存文档。
int modify_add() {
pugi::xml_document doc;
pugi::xml_node node = doc.append_child("new-node");
node.append_attribute("name") = "value";
// 保存文档
doc.save_file("output.xml");
return 0;
}
4. 错误处理
XPath 查询语法或语义错误会抛出异常。
int xpath_error() {
pugi::xml_document doc;
if (!doc.load_file("config.xml")) return -1;
try {
doc.select_nodes("//nodes[#true()]");
} catch (const pugi::xpath_exception& e) {
std::cout << "Select failed: " << e.what() << std::endl;
}
return 0;
}
