【C++】如何使用RapidXML读取和创建XML文件
2023年10月11日,周三下午
目录
- RapidXML的官网
- 使用rapidXML读取XML文件中的元素的属性和值
- 此次要读取的XML文件:ReadExample.xml
- 用于读取此XML文件的C++代码
- 运行结果
- 使用rapidXML创建XML文件
- 用于创建XML文件的C++代码
- 如果上面的代码无法运行
- 运行结果
- 编辑
RapidXML的官网
https://rapidxml.sourceforge.net/
RapidXML只有头文件,不需要编译和配置。

使用rapidXML读取XML文件中的元素的属性和值
此次要读取的XML文件:ReadExample.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- XML声明,指定版本和编码 -->
<root> <!-- 根元素 --> <Connector connectionTimeout="20000" maxParameterCount="1000" port="8088" protocol="HTTP/1.1" redirectPort="8443"/><!--子元素Connector--><book> <!-- 子元素book --><name>C++ Primer</name><author>Stanley B. Lippman</author><price>59.00</price></book> <book><name>Head First Java</name><author>Kathy Sierra</author><price>35.99</price></book>
</root>
用于读取此XML文件的C++代码
#include "rapidxml.hpp"
#include <iostream>
#include <fstream>int main() {rapidxml::xml_document<> doc;// 打开XML文件std::ifstream file("ReadExample.xml");if (!file) {std::cerr << "Failed to open the XML file." << std::endl;return 1;}// 读取XML文件内容到内存std::string xml_contents((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());file.close();// 解析XML文档doc.parse<rapidxml::parse_default>(&xml_contents[0]);// 获取根元素rapidxml::xml_node<>* root = doc.first_node("root");// 遍历子元素bookfor (rapidxml::xml_node<>* book = root->first_node("book"); book; book = book->next_sibling("book")) {// 获取书名rapidxml::xml_node<>* name = book->first_node("name");if (name) {std::cout << "Book Name: " << name->value() << std::endl;}// 获取作者rapidxml::xml_node<>* author = book->first_node("author");if (author) {std::cout << "Author: " << author->value() << std::endl;}// 获取价格rapidxml::xml_node<>* price = book->first_node("price");if (price) {std::cout << "Price: " << price->value() << std::endl;}std::cout << std::endl;}// 获取Connector元素的属性rapidxml::xml_node<>* connector = root->first_node("Connector");if (connector) {std::cout << "Connector Attributes:" << std::endl;for (rapidxml::xml_attribute<>* attr = connector->first_attribute(); attr; attr = attr->next_attribute()) {std::cout << "Attribute Name: " << attr->name() << ", Value: " << attr->value() << std::endl;}}return 0;
}
运行结果

使用rapidXML创建XML文件
用于创建XML文件的C++代码
#include "rapidxml.hpp"
#include "rapidxml_print.hpp" // 用于格式化输出XML
#include <iostream>
#include <fstream>int main() {rapidxml::xml_document<> doc;// 创建根元素rapidxml::xml_node<>* root = doc.allocate_node(rapidxml::node_element, "root");doc.append_node(root);// 创建一个元素bookrapidxml::xml_node<>* book = doc.allocate_node(rapidxml::node_element, "book");root->append_node(book);// 创建book元素的子元素rapidxml::xml_node<>* name = doc.allocate_node(rapidxml::node_element, "name", "C++ Primer");book->append_node(name);rapidxml::xml_node<>* author = doc.allocate_node(rapidxml::node_element, "author", "Stanley B. Lippman");book->append_node(author);rapidxml::xml_node<>* price = doc.allocate_node(rapidxml::node_element, "price", "59.00");book->append_node(price);// 创建第二个book元素book = doc.allocate_node(rapidxml::node_element, "book");root->append_node(book);name = doc.allocate_node(rapidxml::node_element, "name", "Head First Java");book->append_node(name);author = doc.allocate_node(rapidxml::node_element, "author", "Kathy Sierra");book->append_node(author);price = doc.allocate_node(rapidxml::node_element, "price", "35.99");book->append_node(price);// 输出XML到文件std::ofstream file("created.xml");file << doc;file.close();return 0;
}
如果上面的代码无法运行
如果你也遇到了如下这样的错误

那么可以按照下面这两篇文章来创建一个rapidxml_ext.hpp文件
c++ - RapidXML:无法打印 - 编译时错误 - IT工具网 (coder.work)
c++ - RapidXML: Unable to print - Compile-time Error - Stack Overflow
rapidxml_ext.hpp文件的代码如下
//rapidxml_ext.hpp
#pragma once#include "rapidxml.hpp"// Adding declarations to make it compatible with gcc 4.7 and greater
// See https://stackoverflow.com/a/55408678
namespace rapidxml {namespace internal {template <class OutIt, class Ch>inline OutIt print_children(OutIt out, const xml_node<Ch>* node, int flags, int indent);template <class OutIt, class Ch>inline OutIt print_attributes(OutIt out, const xml_node<Ch>* node, int flags);template <class OutIt, class Ch>inline OutIt print_data_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);template <class OutIt, class Ch>inline OutIt print_cdata_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);template <class OutIt, class Ch>inline OutIt print_element_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);template <class OutIt, class Ch>inline OutIt print_declaration_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);template <class OutIt, class Ch>inline OutIt print_comment_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);template <class OutIt, class Ch>inline OutIt print_doctype_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);template <class OutIt, class Ch>inline OutIt print_pi_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);}
}#include "rapidxml_print.hpp"
然后在原来的代码的基础上,引入头文件rapidxml_ext.hpp
注意头文件的顺序,rapidxml_ext.hpp的引入必须先于rapidxml_print.hpp
改正的代码后如下
#include "rapidxml.hpp"
#include "rapidxml_ext.hpp" //只多了这一行
#include "rapidxml_print.hpp" // 用于格式化输出XML
#include <iostream>
#include <fstream>int main() {rapidxml::xml_document<> doc;// 创建根元素rapidxml::xml_node<>* root = doc.allocate_node(rapidxml::node_element, "root");doc.append_node(root);// 创建一个元素bookrapidxml::xml_node<>* book = doc.allocate_node(rapidxml::node_element, "book");root->append_node(book);// 创建book元素的子元素rapidxml::xml_node<>* name = doc.allocate_node(rapidxml::node_element, "name", "C++ Primer");book->append_node(name);rapidxml::xml_node<>* author = doc.allocate_node(rapidxml::node_element, "author", "Stanley B. Lippman");book->append_node(author);rapidxml::xml_node<>* price = doc.allocate_node(rapidxml::node_element, "price", "59.00");book->append_node(price);// 创建第二个book元素book = doc.allocate_node(rapidxml::node_element, "book");root->append_node(book);name = doc.allocate_node(rapidxml::node_element, "name", "Head First Java");book->append_node(name);author = doc.allocate_node(rapidxml::node_element, "author", "Kathy Sierra");book->append_node(author);price = doc.allocate_node(rapidxml::node_element, "price", "35.99");book->append_node(price);// 输出XML到文件std::ofstream file("created.xml");file << doc;file.close();return 0;
}
运行结果
相关文章:
【C++】如何使用RapidXML读取和创建XML文件
2023年10月11日,周三下午 目录 RapidXML的官网使用rapidXML读取XML文件中的元素的属性和值此次要读取的XML文件:ReadExample.xml用于读取此XML文件的C代码运行结果使用rapidXML创建XML文件用于创建XML文件的C代码 如果上面的代码无法运行运行结果编辑…...
《UnityShader入门精要》学习3
笛卡尔坐标系(Cartesian Coordinate System) 二维笛卡儿坐标系 一个二维的笛卡儿坐标系包含了两个部分的信息: 一个特殊的位置,即原点,它是整个坐标系的中心。两条过原点的互相垂直的矢量,即x轴和y轴。这…...
使用Python将MP4视频转换为图像
介绍: 在计算机视觉和机器学习领域,我们经常需要处理视频数据。有时候,我们可能需要将视频转换为图像序列,以便进行后续的分析和处理。本文将介绍如何使用Python和OpenCV库将MP4视频文件转换为图像序列。 步骤: 导入…...
【Vue Router 3】入门
简介 Vue Router让SPA(Single-page Application)的构建更加容易。 Vue Router的功能: 嵌套的路由/视图映射模块化的、基于组件的router配置route params, query, wildcards由Vue过渡系统支持的视图过渡效果细粒度(fine-grained…...
SpringMVC中@RequestMapping注解的详细说明
RequestMapping 是Spring MVC中一个用于映射HTTP请求和控制器方法之间关系的注解。它用于定义控制器方法如何响应特定的HTTP请求,包括GET、POST、PUT、DELETE等。以下是RequestMapping注解的详细说明: 基本用法: RequestMapping("/examp…...
Java - 发送 HTTP 请求的及其简单的方法模块 - hutool
目录 一、POST 传递简单的字符串内容 .body(params)二、POST 传递 Json 数据,以表单类型传递 .form(params)二、POST 传递 Json 数据,以表单类型传递 .form(params) 和 .body(params) 方法效果等效的思路四、传统接口带 token 验证的代码模板参考链接 一…...
Nie et al. 2010 提出的不等式定理
这里写自定义目录标题 定理 定理 For any vector a a a and b b b, we have ∥ a ∥ 2 − ∥ a ∥ 2 2 2 ∥ b ∥ 2 ≤ ∥ b ∥ 2 − ∥ b ∥ 2 2 2 ∥ b ∥ 2 \|a\|_{2} - \frac{\|a\|_{2}^{2}}{2\|b\|_{2}} \leq \|b\|_{2} - \frac{\|b\|_{2}^{2}}{2\|b\|_{2}} ∥a∥2−…...
chatGLM2-6B模型LoRA微调数据集实现大模型的分类任务
【TOC】 1.chatglm介绍 ChatGLM 模型是由清华大学开源的、支持中英双语问答的对话语言模型,并针对中文进行了优化。该模型基于 General Language Model(GLM)架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署。 ChatGLM 具备以下特点: 充…...
Elasticsearch6实践
目录 目录 一、需求 二、ES索引设计 三、页面搜索条件 四、ES的分页搜索DSL语句 五、其他 一、需求 公告列表,需要支持以下搜索 1、根据文本输入,模糊搜索公告标题和公告正文。 2、支持公告类型搜索,单选 3、支持根据公告所在省市区搜…...
云原生Kubernetes:K8S集群版本升级(v1.20.6 - v1.20.15)
目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验 1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 一、理论 1.K8S集群升级 (1)概念 搭建K8S集群的方式有很多种,比如二进制,kubeadm…...
毅速丨3D打印随形水路模具日常如何保养
3D打印随形水路的蜿蜒曲折甚至细微水路,使得其容易发生堵塞并难以清洗,一旦堵塞将对生产带来不小的影响。事实上,堵塞的发生是逐步发展的,所以在生产过程中应注意监控,一旦发现冷却效果下降应及时检查。以下是一些防患…...
尚品甄选2023全新SpringBoot+SpringCloud企业级微服务项目
最适合新手入门的SpringBootSpringCloud企业级微服务项目来啦!如果你已经学习了Java基础、SSM框架、SpringBoot、SpringCloud,想找一个项目来实战练习;或者你刚刚入行,需要可以写到简历中的微服务架构项目! 项目采用前…...
204、RabbitMQ 之 使用 topic 类型的 Exchange 实现通配符路由
目录 ★ 使用topic实现通配符路由代码演示topic通配符类型的Exchange代码演示:ConstantUtilConnectionUtilProducerConsumer01执行结果生产者消费者01消费者02 完整代码:ConstantUtilConnectionUtilProducerConsumer01Consumer02pom.xml ★ 使用topic实现通配符路由…...
qq视频录制教程,让你的视频更加精彩
“qq视频可以录制吗?浏览qq的时候发现一段有趣的视频,点击下载却一直显示失败,朋友叫我把视频录制下来,但是我不知道怎么操作,想问问大家,有没有办法录制qq的视频。” 在信息化的时代,通过视频…...
(滑动窗口) 76. 最小覆盖子串 ——【Leetcode每日一题】
❓76. 最小覆盖子串 难度:困难 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 注意: 对于 t 中重复字符,我们寻找的子字符串…...
grep批量筛选指定目录下的所有日志并写入文件内
背景:在指定目录下,该目录下有上百个日志文件,这些文件以.log结尾 需求:遍历这些日志文件,对每个日志文件进行grep筛选,筛选出包含namexxx和 "server_port":"8088"的内容,并…...
JVM第三讲:JVM 基础-字节码的增强技术详解
JVM 基础-字节码的增强技术详解 本文是JVM第三讲,JVM 基础-字节码的增强技术。在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术…...
JWT前后端分离在项目中的应用
14天阅读挑战赛当你累了,要学会休息,而不是放弃! 目录 一、JWT简介 1.1 什么是JWT 1.2 为什么要使用JWT,与session的区别 1.3 JWT组成及工作原理和流程 二、JWT工具类解析 2.1 生成JWT 2.2 解析oldJwt 2.3 复制JWT并延时…...
系统架构师备考倒计时23天(每日知识点)Redis篇
Redis篇 1.Redis与Memcache能力对比 工作MemCacheRedis数据类型简单 key/value 结构丰富的数据结构持久性不支持支持分布式存储客户端哈希分片/一致性哈希多种方式,主从、Sentinel、Cluster 等多线程支持支持支持(Redis5.0及以前版本不支持)内存管理私有内存池/内…...
WIN11系统设置重启与睡眠唤醒后自动拨号
文章目录 1. win x快捷键后选择计算机管理2. 编辑名称3. 选择计算机启动时4. 启动程序5. 输入脚本6. 勾选选项7. 填写配置8. 新建触发器9. 设置触发器10. 确定之后完成创建 1. win x快捷键后选择计算机管理 在任务计划程序中创建基本任务 2. 编辑名称 3. 选择计算机启动时 4…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
