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

【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日&#xff0c;周三下午 目录 RapidXML的官网使用rapidXML读取XML文件中的元素的属性和值此次要读取的XML文件&#xff1a;ReadExample.xml用于读取此XML文件的C代码运行结果使用rapidXML创建XML文件用于创建XML文件的C代码 如果上面的代码无法运行运行结果​编辑…...

《UnityShader入门精要》学习3

笛卡尔坐标系&#xff08;Cartesian Coordinate System&#xff09; 二维笛卡儿坐标系 一个二维的笛卡儿坐标系包含了两个部分的信息&#xff1a; 一个特殊的位置&#xff0c;即原点&#xff0c;它是整个坐标系的中心。两条过原点的互相垂直的矢量&#xff0c;即x轴和y轴。这…...

使用Python将MP4视频转换为图像

介绍&#xff1a; 在计算机视觉和机器学习领域&#xff0c;我们经常需要处理视频数据。有时候&#xff0c;我们可能需要将视频转换为图像序列&#xff0c;以便进行后续的分析和处理。本文将介绍如何使用Python和OpenCV库将MP4视频文件转换为图像序列。 步骤&#xff1a; 导入…...

【Vue Router 3】入门

简介 Vue Router让SPA&#xff08;Single-page Application&#xff09;的构建更加容易。 Vue Router的功能&#xff1a; 嵌套的路由/视图映射模块化的、基于组件的router配置route params, query, wildcards由Vue过渡系统支持的视图过渡效果细粒度&#xff08;fine-grained…...

SpringMVC中@RequestMapping注解的详细说明

RequestMapping 是Spring MVC中一个用于映射HTTP请求和控制器方法之间关系的注解。它用于定义控制器方法如何响应特定的HTTP请求&#xff0c;包括GET、POST、PUT、DELETE等。以下是RequestMapping注解的详细说明&#xff1a; 基本用法&#xff1a; RequestMapping("/examp…...

Java - 发送 HTTP 请求的及其简单的方法模块 - hutool

目录 一、POST 传递简单的字符串内容 .body(params)二、POST 传递 Json 数据&#xff0c;以表单类型传递 .form(params)二、POST 传递 Json 数据&#xff0c;以表单类型传递 .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语句 五、其他 一、需求 公告列表&#xff0c;需要支持以下搜索 1、根据文本输入&#xff0c;模糊搜索公告标题和公告正文。 2、支持公告类型搜索&#xff0c;单选 3、支持根据公告所在省市区搜…...

云原生Kubernetes:K8S集群版本升级(v1.20.6 - v1.20.15)

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验 1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 一、理论 1.K8S集群升级 &#xff08;1&#xff09;概念 搭建K8S集群的方式有很多种&#xff0c;比如二进制&#xff0c;kubeadm…...

毅速丨3D打印随形水路模具日常如何保养

3D打印随形水路的蜿蜒曲折甚至细微水路&#xff0c;使得其容易发生堵塞并难以清洗&#xff0c;一旦堵塞将对生产带来不小的影响。事实上&#xff0c;堵塞的发生是逐步发展的&#xff0c;所以在生产过程中应注意监控&#xff0c;一旦发现冷却效果下降应及时检查。以下是一些防患…...

尚品甄选2023全新SpringBoot+SpringCloud企业级微服务项目

最适合新手入门的SpringBootSpringCloud企业级微服务项目来啦&#xff01;如果你已经学习了Java基础、SSM框架、SpringBoot、SpringCloud&#xff0c;想找一个项目来实战练习&#xff1b;或者你刚刚入行&#xff0c;需要可以写到简历中的微服务架构项目&#xff01; 项目采用前…...

204、RabbitMQ 之 使用 topic 类型的 Exchange 实现通配符路由

目录 ★ 使用topic实现通配符路由代码演示topic通配符类型的Exchange代码演示:ConstantUtilConnectionUtilProducerConsumer01执行结果生产者消费者01消费者02 完整代码&#xff1a;ConstantUtilConnectionUtilProducerConsumer01Consumer02pom.xml ★ 使用topic实现通配符路由…...

qq视频录制教程,让你的视频更加精彩

“qq视频可以录制吗&#xff1f;浏览qq的时候发现一段有趣的视频&#xff0c;点击下载却一直显示失败&#xff0c;朋友叫我把视频录制下来&#xff0c;但是我不知道怎么操作&#xff0c;想问问大家&#xff0c;有没有办法录制qq的视频。” 在信息化的时代&#xff0c;通过视频…...

(滑动窗口) 76. 最小覆盖子串 ——【Leetcode每日一题】

❓76. 最小覆盖子串 难度&#xff1a;困难 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串…...

grep批量筛选指定目录下的所有日志并写入文件内

背景&#xff1a;在指定目录下&#xff0c;该目录下有上百个日志文件&#xff0c;这些文件以.log结尾 需求&#xff1a;遍历这些日志文件&#xff0c;对每个日志文件进行grep筛选&#xff0c;筛选出包含namexxx和 "server_port":"8088"的内容&#xff0c;并…...

JVM第三讲:JVM 基础-字节码的增强技术详解

JVM 基础-字节码的增强技术详解 本文是JVM第三讲&#xff0c;JVM 基础-字节码的增强技术。在上文中&#xff0c;着重介绍了字节码的结构&#xff0c;这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术…...

JWT前后端分离在项目中的应用

14天阅读挑战赛当你累了&#xff0c;要学会休息&#xff0c;而不是放弃&#xff01; 目录 一、JWT简介 1.1 什么是JWT 1.2 为什么要使用JWT&#xff0c;与session的区别 1.3 JWT组成及工作原理和流程 二、JWT工具类解析 2.1 生成JWT 2.2 解析oldJwt 2.3 复制JWT并延时…...

系统架构师备考倒计时23天(每日知识点)Redis篇

Redis篇 1.Redis与Memcache能力对比 工作MemCacheRedis数据类型简单 key/value 结构丰富的数据结构持久性不支持支持分布式存储客户端哈希分片/一致性哈希多种方式&#xff0c;主从、Sentinel、Cluster 等多线程支持支持支持(Redis5.0及以前版本不支持)内存管理私有内存池/内…...

WIN11系统设置重启与睡眠唤醒后自动拨号

文章目录 1. win x快捷键后选择计算机管理2. 编辑名称3. 选择计算机启动时4. 启动程序5. 输入脚本6. 勾选选项7. 填写配置8. 新建触发器9. 设置触发器10. 确定之后完成创建 1. win x快捷键后选择计算机管理 在任务计划程序中创建基本任务 2. 编辑名称 3. 选择计算机启动时 4…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...

从0开始学习R语言--Day17--Cox回归

Cox回归 在用医疗数据作分析时&#xff0c;最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据&#xff0c;往往会有很多的协变量&#xff0c;即使我们通过计算来减少指标对结果的影响&#xff0c;我们的数据中依然会有很多的协变量&#xff0c;且…...