PugiXML,一个高效且简单的 C++ XML 解析库!

news2024/12/17 12:06:19

嗨,大家好!我是一行。今天要给大家介绍 PugiXML,这可是 C++ 里处理 XML 数据的得力助手。它能轻松地读取、修改和写入 XML 文件,就像一个专业的 XML 小管家,不管是解析配置文件,还是处理网页数据,它都能高效搞定,让我们一起来探索吧!

一、PugiXML 是什么?

PugiXML 就是用来处理 XML 文档的神器。XML 呢,就像是一个有条理的信息仓库,里面的数据都被整齐地分类存放。而 PugiXML 能帮我们快速地在这个仓库里找到想要的东西,或者对里面的东西进行整理和更新。比如说,我们有一个游戏的配置 XML 文件,存着画面设置、声音设置等信息,PugiXML 就能帮我们读取这些设置,然后在程序里应用,让游戏按照我们的喜好运行。 小贴士:安装 PugiXML 时,要注意把相关的头文件和库文件都放到正确的位置哦,不然编译器可能会找不到它们。在一些项目中,可能还需要在项目设置里添加对 PugiXML 库的引用路径。

二、读取 XML 文件示例

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

int main() {
    // 创建一个 XML 文档对象,就像打开一个信息仓库的大门
    pugi::xml_document doc;

    // 加载 XML 文件,如果成功,就像顺利进入了仓库
    if (doc.load_file("example.xml")) {
        // 获取根节点,这是仓库的最顶层分类
        pugi::xml_node root = doc.root();

        // 遍历根节点的子节点,就像查看仓库里每个分类下的物品
        for (pugi::xml_node child = root.first_child(); child; child = child.next_sibling()) {
            std::cout << "节点名称: " << child.name() << ", 节点值: " << child.child_value() << std::endl;
        }
    } else {
        std::cerr << "无法加载 XML 文件" << std::endl;
    }

    return 0;
}

假设我们有一个 example.xml 文件,内容如下:

<root>
    <setting1>值 1</setting1>
    <setting2>值 2</setting2>
</root>

运行上面的代码,就会输出每个节点的名称和值,像这样:

节点名称: setting1, 节点值: 值 1
节点名称: setting2, 节点值: 值 2

这里我们先用 doc.load_file 打开 XML 文件,然后通过 root.first_childnext_sibling 遍历子节点,获取它们的名称和值,是不是很方便?

三、修改 XML 文件示例

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

int main() {
    pugi::xml_document doc;
    if (doc.load_file("example.xml")) {
        pugi::xml_node root = doc.root();

        // 找到要修改的节点,就像在仓库里找到特定的物品
        pugi::xml_node setting1 = root.child("setting1");
        if (setting1) {
            // 修改节点的值,就像给物品换个标签
            setting1.text() = "新值 1";
        }

        // 保存修改后的 XML 文件,就像把仓库整理好后关门
        doc.save_file("example.xml");
    } else {
        std::cerr << "无法加载 XML 文件" << std::endl;
    }

    return 0;
}

运行这段代码后,example.xml 里的 <setting1> 节点的值就会变成“新值 1”。我们通过 root.child 找到要修改的节点,然后直接给它的 text 赋值,最后用 doc.save_file 保存修改,是不是很简单?小贴士:在修改 XML 文件时,要小心别改错了节点,不然可能会导致 XML 数据不符合预期哦。

四、创建 XML 文件示例

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

int main() {
    // 创建一个新的 XML 文档对象
    pugi::xml_document doc;

    // 添加根节点,就像搭建一个新的仓库框架
    pugi::xml_node root = doc.append_child("root");

    // 在根节点下添加子节点,就像往仓库里放东西
    pugi::xml_node child1 = root.append_child("item1");
    child1.append_child(pugi::node_pcdata).set_value("这是 item1 的值");

    pugi::xml_node child2 = root.append_child("item2");
    child2.append_child(pugi::node_pcdata).set_value("这是 item2 的值");

    // 保存 XML 文件
    doc.save_file("new_example.xml");

    return 0;
}

运行后,会生成一个 new_example.xml 文件,内容如下:

<root>
    <item1>这是 item1 的值</item1>
    <item2>这是 item2 的值</item2>
</root>

这里我们通过 append_child 方法一步步地构建 XML 结构,然后保存文件,轻松创建了一个新的 XML 文件。

五、实际应用场景

在软件开发中,很多配置文件都用 XML 格式存储,PugiXML 就能用来读取和修改这些配置,比如软件的界面布局、功能开关等设置。在网络数据处理方面,如果接收到的是 XML 格式的网页数据,它可以快速解析出关键信息,像新闻网站的文章标题、内容、发布时间等,方便后续的展示和处理。

六、练习题

大家可以找一个现有的 XML 格式的配置文件,用 PugiXML 读取里面的信息,然后修改其中几个节点的值,再保存回去。还可以尝试用 PugiXML 创建一个 XML 文件,记录一些个人信息,比如姓名、年龄、爱好等,然后读取这个文件并输出里面的内容。

今天的 C++ 学习之旅就到这里啦!记得动手敲代码。祝大家学习愉快,C++ 学习节节高!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于贝叶斯优化LightGBM模型对医院防火隐患区域火灾风险预测

一、引言 &#xff08;一&#xff09;研究背景与意义 医院作为人员密集、设备复杂且存放大量易燃易爆物品的场所&#xff0c;防火安全至关重要。一旦发生火灾&#xff0c;极易造成严重的人员伤亡和财产损失。火灾风险预测能够提前识别潜在的火灾隐患区域&#xff0c;为制定有…

第二届CN-fnst re题wp

题目附件名称amazingbruteforce 首先查壳&#xff0c;发现有upx壳&#xff08;主页有教程&#xff0c;这边就不说了&#xff09;&#xff0c;脱掉壳&#xff0c;64位程序&#xff0c;拖进ida64进行反编译&#xff0c;如下图 很简单的逻辑&#xff0c;v5一个数组&#xff0c;v4…

Python系统教程008-条件判断(二)

知识回顾 1、if语句的基本语法&#xff1f; 2、常用 的比较运算符有哪些&#xff1f; 3、注释的分类以及格式 4、else处理条件不满足的情况 练习&#xff1a; 地板上有n个石子&#xff0c;猫头鹰和小兔子正在玩取石子的游戏&#xff0c;从猫头鹰开始&#xff0c;轮流取石子&a…

爬虫逆向学习(十四):分享一下某数通用破解服务开发经验

阅前须知 这篇博客不是教大家怎么实现的&#xff0c;而且告知大家有这个东西&#xff0c;或者说一种趋势&#xff0c;借此分享自己大致的实现经验。具体的实现我也不好整理&#xff0c;毕竟是在别人的基础上缝缝补补。 前言 使用补环境方式破解过某数的同学都知道&#xff0…

知识分享第二十八天-数学篇一

组合.二项式定理.常见导数 组合 让我们通过一个具体的例子来理解组合&#xff08;Combinations&#xff09;的概念 假设你有一个装有5个不同颜色球的袋子&#xff1a;红、蓝、绿、黄和紫。你想从中随机抽取3个球&#xff0c; 不考虑顺序&#xff0c;那么你可以有多少种不同的…

Kruskal最小生成树算法正确性证明

Kruskal: 每次考虑最短一条边, 如果会形成回路则不选择该边, 如果不会形成回路则选择该边, 直到选出了n-1条边 要点: 每次都选择不会形成回路的最短边 数学归纳法 ① n<2时, 显然成立 ② 设n k时成立, 则当n k1时: 将图划分为 子图A(k) 和 B(1) ∵ n k时成立 ∴ A(k)可…

Liveweb视频汇聚平台支持WebRTC协议赋能H.265视频流畅传输

随着科技的飞速发展和网络技术的不断革新&#xff0c;视频监控已经广泛应用于社会各个领域&#xff0c;成为现代安全管理的重要组成部分。在视频监控领域&#xff0c;视频编码技术的选择尤为重要&#xff0c;它不仅关系到视频的质量&#xff0c;还直接影响到视频的传输效率和兼…

iPhone苹果相册视频怎么提取音频?

在数字时代&#xff0c;视频已成为我们记录生活、分享故事的重要方式。然而&#xff0c;有时候我们只想保留视频中的音频部分&#xff0c;比如一段动人的背景音乐或是一段珍贵的对话。那么&#xff0c;苹果相册视频怎么提取音频呢&#xff1f;本文将介绍三种简单且实用的方法&a…

【图像配准】方法总结

图像配准(Image registration)就是将不同时间、不同传感器&#xff08;成像设备&#xff09;或不同条件下&#xff08;天候、照度、摄像位置和角度等&#xff09;获取的两幅或多幅图像进行匹配、叠加的过程&#xff0c;就是找到1幅图像像素到另1幅图像像素间的空间映射关系它已…

专业140+总分400+北京理工大学826信号处理导论考研经验北理工电子信息与通信工程,真题,大纲,参考书。

考研总分400&#xff0c;专业826信号处理导论&#xff08;信号与系统和dsp&#xff09;140&#xff0c;成功上岸北理工&#xff0c;虽然已经一段时间&#xff0c;但是后劲很大&#xff0c;每每回想还是昨日事&#xff0c;群里同学多次要求分享自己的一些经验&#xff0c;感谢大…

ReactPress最佳实践—搭建导航网站实战

Github项目地址&#xff1a;https://github.com/fecommunity/easy-blog 欢迎Star。 近期&#xff0c;阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress&#xff0c;ReactPress一个基于 Next.js 的博客和 CMS 系统&#xff0c;可查看 demo站点。&#xff08;…

Windows 环境实战开源项目GFPGAN 教程

GFPGAN GFPGAN&#xff08;Generative Facial Prior-GAN&#xff09;是由腾讯ARC&#xff08;Applied Research Center&#xff09;开发的一种实用的真实世界人脸修复算法。它专门设计用于人脸图像的生成和优化&#xff0c;尤其在低质量人脸图像的超分辨率恢复方面表现出色。以…

链表的应用

尾删 int tail_del (linkListPtr S) { if(NULL S || empty(S)) { printf("失败\n"); return 0; } linkListPtr q S; for(int i0 ; i<S->len-1;i) { qq->next; } free(q->next); q->n…

一个小工具

院内感染监控系统 开发工具Delphi7 报表工具FastReport unit U_Ymjg;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, RzButton, ExtCtrls, RzPanel, ImgList, Grids, RzGrids, StdCtrls,RzCmboBx, DB, ADODB;typeTFrm_ym…

Python:程序中如何引用环境变量

应用场景&#xff1a;具有安全性的信息&#xff08;如密钥&#xff09;&#xff0c;为方式代码提交被同时提交到公共环境&#xff08;如git&#xff09;&#xff0c;可以通过环境变量配置后&#xff0c;在代码中直接引用。 优点&#xff1a;安全、复用性强、持久化&#xff08…

电力场景绝缘子缺陷识别分割数据集labelme格式1099张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;1099 标注数量(json文件个数)&#xff1a;1099 标注类别数&#xff1a;3 标注类别名称:["brokenpart","brokeninsulator…

C++ -- 哈希表封装实现unordered_map 和 unordered_set

本章内容分为源码看框架讲解和结构模拟实现两部分&#xff0c;源码框架是让我们了解容器结构在设计时的思路&#xff0c;模拟实现才是重点。因此如果在看源码结构式感到疑惑&#xff0c;不妨继续往下看&#xff0c;相信一切都会慢慢了解~ 源码及框架分析 在C98 / SGI-STL30版本…

修改vscode中emmet中jsx和tsx语法中className的扩展符号从单引号到双引号 - HTML代码补全 - 单引号双引号

效果图 实现步骤 文件 > 首选项 > 设置搜索“”在settings.json中修改&#xff0c;增加 "emmet.syntaxProfiles": {"html": {"attr_quotes": "single"},"jsx": {"attr_quotes": "double","…

CSS学习记录12

CSS浮动 CSSfloat属性规定元素如何浮动 CSSclear属性规定哪些元素可以在清除的元素旁边以及在哪一侧浮动。 float属性 float属性用于定位和格式化内容&#xff0c;例如让图像向左浮动到容器的文本那里。 float属性可以设置以下值之一&#xff1a; left - 元素浮动到其容器…

IDEA搭建SpringBoot,MyBatis,Mysql工程项目

目录 一、前言 二、项目结构 三、初始化项目 四、SpringBoot项目集成Mybatis编写接口 五、代码仓库 一、前言 构建一个基于Spring Boot框架的现代化Web应用程序&#xff0c;以满足[公司/组织名称]对于[业务需求描述]的需求。通过利用Spring Boot简化企业级应用开发的优势&…