在C++中处理XML:PugiXML和RapidXML库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在C++中处理XML:PugiXML和RapidXML库



XML(可扩展标记语言)仍然是存储和传输结构化数据的关键格式之一。在C++中,有多个强大的库可用于处理XML,其中突出的是PugiXML(轻量级,支持XPath)和RapidXML(速度极快,“原地”工作)。在本文中,我们将介绍这两个库、它们的特点、安装方法以及实际示例。



1. PugiXML — 通用工具



PugiXML是一个轻量级、跨平台的库,支持XPath 1.0以及UTF-8/UTF-16编码。它非常适合大多数任务:从读取配置文件到复杂的XML文档分析。



安装

从官方网站下载头文件,或使用包管理器(vcpkg、Conan)。在项目中包含:

#include "pugixml.hpp"using namespace pugi;


示例:加载和读取XML

#include <iostream>#include "pugixml.hpp"

int main() { xml_document doc; if (!doc.load_file("config.xml")) { std::cerr << "文件加载错误"; return -1; }

// 获取根元素 xml_node root = doc.child("settings"); for (xml_node node = root.child("param"); node; node = node.next_sibling("param")) { std::string name = node.attribute("name").as_string(); int value = node.attribute("value").as_int(); std::cout << "参数: " << name << " = " << value << ""; } return 0;}


示例:创建XML文档

xml_document doc;xml_node root = doc.append_child("catalog");for (int i = 1; i <= 3; ++i) {    xml_node item = root.append_child("item");    item.append_attribute("id") = i;    item.append_child("name").text() = ("商品 " + std::to_string(i)).c_str();    item.append_child("price").text() = 100.0 * i;}doc.save_file("catalog.xml");


PugiXML的优势:

  • 支持XPath进行复杂查询(例如,doc.select_nodes("//item[@id>1]"))。
  • 支持编码和Unicode。
  • 详细的文档和活跃的社区。


2. RapidXML — 速度与极简



RapidXML是一个仅头文件的库,它在不复制数据的情况下解析XML(原地解析)。它的速度明显快于PugiXML,但不支持XPath,并且需要小心处理字符串的生命周期。



安装

将rapidxml.hpp和其他文件(rapidxml_utils.hpp、rapidxml_print.hpp)复制到项目中。



示例:解析字符串

#include <iostream>#include "rapidxml.hpp"

int main() { char xml[] = "<root><item id='1'>值</item></root>"; rapidxml::xml_document<> doc; doc.parse<0>(xml); // 0 — 解析标志

rapidxml::xml_node<>* root = doc.first_node("root"); rapidxml::xml_node<>* item = root->first_node("item"); if (item) { std::cout << "ID: " << item->first_attribute("id")->value() << ""; std::cout << "内容: " << item->value() << ""; } return 0;}


示例:创建XML

rapidxml::xml_document<> doc;rapidxml::xml_node<>* root = doc.allocate_node(rapidxml::node_element, "data");doc.append_node(root);

rapidxml::xml_node<>* child = doc.allocate_node(rapidxml::node_element, "value", "42");root->append_node(child);

// 输出到字符串std::string result;rapidxml::print(std::back_inserter(result), doc);std::cout << result;


重要提示:

推荐