C++ pugixml库怎么用 轻量级XML解析器

来源:Nodejs社区作者:泰国程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《C++ pugixml库怎么用 轻量级XML解析器》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++ pugixml库怎么用 轻量级XML解析器》有用,将其分享出去将是对创作者最好的鼓励。

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

C++ pugixml库怎么用 轻量级XML解析器

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。