当前位置: 首页 > news >正文

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

嗨,大家好!我是一行。今天要给大家介绍 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++ 学习节节高!

相关文章:

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

嗨&#xff0c;大家好&#xff01;我是一行。今天要给大家介绍 PugiXML&#xff0c;这可是 C 里处理 XML 数据的得力助手。它能轻松地读取、修改和写入 XML 文件&#xff0c;就像一个专业的 XML 小管家&#xff0c;不管是解析配置文件&#xff0c;还是处理网页数据&#xff0c;…...

Linux设备树的驱动开发

概述 本文介绍了platform框架下的设备驱动开发流程和方法&#xff0c;主要包括设备树、驱动程序和应用程序的开发。以随机数驱动为例&#xff0c;实现了应用程序调用库函数&#xff0c;通过系统调用陷入内核&#xff0c;最后执行硬件驱动&#xff0c;获取真随机数的过程。 添…...

连锁?下沉?AI?2025年餐饮新活力!

如果要用几个词来形容 2024 年的餐饮业&#xff0c;这些词大概率会是「卷、难、惨」&#xff0c;用著名商业顾问刘润的话来说就是「卷到极致」。虽然餐饮人在社交平台上叫苦连天&#xff0c;但当我们查看餐饮大盘数据时发现&#xff0c;大盘在涨&#xff0c;与个体餐饮人的实感…...

Javascript中如何实现函数缓存?函数缓存有哪些应用场景?

今天要聊的一个很经典的问题——如何在JavaScript中实现函数缓存&#xff0c;以及它有哪些应用场景。 我们先来明确一下&#xff0c;函数缓存是什么。简单来说&#xff0c;函数缓存是将函数的运算结果存储起来&#xff0c;以便下次用到相同的输入时&#xff0c;可以直接返回结…...

子页面访问父页面

子页面访问父页面的方式主要依赖于页面之间的关系&#xff0c;特别是它们是否处于同一域、是否是嵌套在 <iframe> 中、或者通过弹出窗口打开。下面是几种常见的子页面访问父页面的方法&#xff1a; 1. 通过 window.parent 访问父页面&#xff08;适用于嵌套的 iframe&am…...

芯片级IO (Pad) Ring IP Checklist

SoC top顶层数字后端实现都会涉及到IO Ring &#xff08;PAD Ring&#xff09;的设计。这里面包括VDD IO,VDDIO IO, Signal IO, Corner IO&#xff0c;Filler IO&#xff0c;IO power cut cell等等。 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字IC后端实现TOP F…...

计算机毕业设计论文指导

计算机毕业设计论文指导 计算机毕业设计辅导一站式&#xff01;太香了&#x1f4aa; [赞R][赞R][赞R]嗨喽&#xff01;计算机专业的宝子们&#xff01; 计算机毕设辅导专业靠谱的他来了&#xff01;&#xff01; 是不是还在为选题程序不会做而感到苦难&#xff1f; 论文没思路赶…...

Electron-Vue 开发下 dev/prod/webpack server各种路径设置汇总

背景 在实际开发中&#xff0c;我发现团队对于这几个路径的设置上是纯靠猜的&#xff0c;通过一点点地尝试来找到可行的路径&#xff0c;这是不应该的&#xff0c;我们应该很清晰地了解这几个概念&#xff0c;以下通过截图和代码进行细节讲解。 npm run dev 下的路径如何处理&…...

Vue.js前端框架教程9:Vue插槽slot用法

文章目录 插槽&#xff08;Slots&#xff09;无名插槽&#xff08;默认插槽&#xff09;具名插槽reference 插槽使用 v-slot 的缩写语法 插槽&#xff08;Slots&#xff09; 在 Vue 中&#xff0c;插槽&#xff08;Slots&#xff09;是一种组件内容分发的机制&#xff0c;允许…...

初学stm32 --- NVIC中断

目录 STM32 NVIC 中断优先级管理 NVIC_Type: ISER[8]&#xff1a; ICER[8]&#xff1a; ISPR[8]&#xff1a; ICPR[8]&#xff1a; IABR[8]&#xff1a; IP[240]&#xff1a; STM32 的中断分组&#xff1a; 中断优先级分组函数 NVIC_PriorityGroupConfig 中断初始化函…...

Jest 入门指南:从零开始编写 JavaScript 单元测试

前言 在前端开发中&#xff0c;单元测试已经成为确保代码质量和稳定性的关键步骤。Jest 作为由 Facebook 开发和维护的功能强大的 JavaScript 测试框架&#xff0c;以其易于配置、丰富的功能和开箱即用的特性&#xff0c;成为众多开发者的首选工具。本文旨在引导你从零开始&am…...

【Java Web】Axios实现前后端数据异步交互

目录 一、Promise概述 二、Promise基本用法 三、async和await关键字 四、Axios介绍 4.1 Axios基本用法 4.2 Axios简化用法之get和post方法 五、Axios拦截器 六、跨域问题处理 一、Promise概述 axios是代替原生的ajax实现前后端数据交互的一套新解决方案&#xff0c;而…...

React 第十七节 useMemo用法详解

概述 useMemo 是React 中的一个HOOK&#xff0c;用于根据依赖在每次渲染时候缓存计算结果&#xff1b; 大白话就是&#xff0c;只有依赖项发生变化时候&#xff0c;才会重新渲染为新计算的值&#xff0c;否则就还是取原来的值&#xff0c;有点类似 vue 中的 computed 计算属性…...

鸿蒙项目云捐助第十五讲云数据库的初步使用

鸿蒙项目云捐助第十五讲云数据库的初步使用 在华为云技术使用中&#xff0c;前面使用了云函数&#xff0c;接下来看一下华为云技术中的另外一个技术云数据库的使用。 一、云数据库的创建 这里使用华为云数据库也需要登录到AppGallery Connect平台中&#xff0c;点击进入到之…...

如何构建一个可信的联邦RAG系统。

今天给大家分享一篇论文。 题目是&#xff1a;C-RAG&#xff1a;如何构建一个可信的联邦检索RAG系统。 论文链接:https://arxiv.org/abs/2412.13163 论文概述 尽管大型语言模型 (LLM) 在各种应用中展现出令人印象深刻的能力&#xff0c;但它们仍然存在可信度问题&#xff…...

【深度学习之三】FPN与PAN网络详解

FPN与PAN&#xff1a;深度学习中的特征金字塔网络与路径聚合网络 在深度学习的领域里&#xff0c;特征金字塔网络&#xff08;Feature Pyramid Networks&#xff0c;简称FPN&#xff09; 和 路径聚合网络&#xff08;Path Aggregation Network&#xff0c;简称PAN&#xff09;…...

Qt学习笔记第71到80讲

第71讲 事件过滤器的方式实现滚轮按键放大 事件体系&#xff08;事件派发 -> 事件过滤->事件分发->事件处理&#xff09;中&#xff0c;程序员主要操作的是事件分发与事件处理。我们之前已经通过继承QTextEdit来重写事件实现Ctrl加滚轮的检测&#xff0c;还有一种处理…...

以管理员身份运行

同时按下Ctrl Shift Esc键打开任务管理器&#xff0c;在任务管理器的左上角&#xff0c;点击“文件”菜单&#xff0c;在下拉菜单中选择“新建任务” 在弹出的对话框中&#xff0c;输入您想要运行的程序的名称。如果您不确定程序的确切名称&#xff0c;可以点击“浏览”来找到…...

用 Python 实现井字棋游戏

一、引言 井字棋&#xff08;Tic-Tac-Toe&#xff09;是一款经典的两人棋类游戏。在这个游戏中&#xff0c;玩家轮流在 3x3 的棋盘上放置自己的标记&#xff0c;通常是 “X” 和 “O”&#xff0c;第一个在棋盘上连成一线&#xff08;横、竖或斜&#xff09;的玩家即为获胜者。…...

06 实现自定义AXI DMA驱动

为什么要实现自定义AXI DMA驱动 ZYNQ 的 AXI DMA 在 Direct Register DMA &#xff08;即 Simple DMA&#xff09;模式下可以通过 AXIS 总线的 tlast 提前结束传输&#xff0c;同时还可以在 BUFFLEN 寄存器中读取到实际传输的字节数&#xff0c;但是通过 Linux 的 DMA 驱动框架…...

Go语言中的文件操作:从os到ioutil

Go语言中的文件操作&#xff1a;从os到ioutil 1. 文件操作的基本概念 文件操作是编程中常见的任务&#xff0c;包括创建、读取、写入、删除文件&#xff0c;以及操作目录等。在Go语言中&#xff0c;文件操作主要通过 os、io、ioutil 和 io/fs 等包来实现。 Go语言的文件操作设计…...

SDMatte高清人像抠图作品集:影视级海报与创意合成的幕后利器

SDMatte高清人像抠图作品集&#xff1a;影视级海报与创意合成的幕后利器 1. 开篇&#xff1a;当AI遇见专业级人像抠图 想象一下这样的场景&#xff1a;电影海报需要将主演从绿幕背景中完美剥离&#xff0c;电商广告要把模特无缝融入不同场景&#xff0c;艺术创作需要将人物与…...

基于LSTM与SmolVLA的时序多模态数据分析

基于LSTM与SmolVLA的时序多模态数据分析 想象一下&#xff0c;你面前有一段监控视频&#xff0c;画面里有人正在行走、停留、再行走。如果只看其中一帧&#xff0c;你只能知道“这里有个人”&#xff1b;但如果把连续几帧连起来看&#xff0c;你就能判断出“这个人正在从A点走…...

基于AkShare构建A股基础数据自动化采集方案

1. 为什么需要自动化采集A股基础数据 做量化研究的朋友都知道&#xff0c;获取准确、完整的股票基础数据是策略开发的基石。我刚开始做量化时&#xff0c;最头疼的就是每次跑策略前都要手动更新股票列表&#xff0c;经常因为数据不全导致回测结果失真。后来发现AkShare这个宝藏…...

5分钟快速修复Windows更新故障:Reset Windows Update Tool完全指南

5分钟快速修复Windows更新故障&#xff1a;Reset Windows Update Tool完全指南 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …...

FLAC3D蠕变三轴压缩试验:博格斯摩尔本构应变时间曲线

FLAC3D蠕变三轴压缩试验&#xff1a;博格斯摩尔本构&#xff0c;应变时间曲线在岩土工程数值模拟里&#xff0c;蠕变试验就像给材料做"慢动作回放"。今天咱们拿FLAC3D折腾个博格斯摩尔&#xff08;Burgers-Malvern&#xff09;模型的蠕变三轴压缩试验&#xff0c;重点…...

Java 25 FFI与C++ ABI不兼容?GCC 13/Clang 18符号修饰差异导致段错误的逆向工程溯源(含LLVM IR级对比图)

第一章&#xff1a;Java 25 FFI与C ABI不兼容问题的现场复现与现象确认Java 25 引入的 Foreign Function & Memory API&#xff08;FFI&#xff09;在调用 C 原生函数时&#xff0c;因 C ABI&#xff08;Application Binary Interface&#xff09;未被标准化支持&#xff0…...

千问3.5-2B镜像实战:免conda/pip安装,网页端直接调用内置视觉语言模型

千问3.5-2B镜像实战&#xff1a;免conda/pip安装&#xff0c;网页端直接调用内置视觉语言模型 1. 镜像介绍与核心能力 千问3.5-2B是Qwen系列中的轻量级视觉语言模型&#xff0c;专为图片理解和文本生成任务优化。这个预置镜像的最大特点是开箱即用——无需任何conda或pip安装…...

金蝶K3生产任务单状态查询SQL全解析:从计划到结案

1. 金蝶K3生产任务单状态查询SQL入门指南 第一次接触金蝶K3的生产任务单查询时&#xff0c;我也被那些复杂的SQL语句搞得头晕眼花。后来才发现&#xff0c;只要理解了系统设计逻辑&#xff0c;这些查询其实就像查快递单号一样简单。生产任务单在系统中会经历计划、确认、下达、…...

从变砖到重生:红魔全系9008深度救砖指南与实战解析

1. 什么是9008模式&#xff1f;为什么能救砖&#xff1f; 当你发现红魔手机卡在开机界面、反复重启甚至完全黑屏时&#xff0c;大概率是遇到了传说中的"变砖"。这时候高通芯片隐藏的9008模式就是最后的救命稻草。简单来说&#xff0c;9008模式相当于电脑的BIOS界面&…...