【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…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
