XML的创建和读取

news/2024/5/5 2:42:03/文章来源:https://blog.csdn.net/lmy347771232/article/details/128044766

rapidxml是一个快速的xml库,由C++模板实现的高效率xml解析库,同时也是boost库的property_tree的内置解析库。

当使用rapidxml时,只需要把rapidxml.hpp 、 rapidxml_print.hpp 和
rapidxml_utils.hpp 三个文件拷贝到你的工程目录下,就可以了。

一、xml的创建

1.xml创建并打印

代码执行时发现的错误:
bool Create(std::string filename)
{//DOMrapidxml::xml_document<>doc;2.node_declarationrapidxml::xml_node<>* declaration = doc.allocate_node(rapidxml::node_declaration);declaration->append_attribute(doc.allocate_attribute("version", "1.0"));declaration->append_attribute(doc.allocate_attribute("encoding", "utf-8"));doc.append_node(declaration);下面代码出问题:有如下图片显示的错误std::cout << doc;// 无法编译通过,为什么?std::ofstream outfile(filename, std::ios::out);if (outfile){下面代码出问题:有如下图片显示的错误char* end = rapidxml::print(buff, doc, 0);//无法编译通过//std::cout << buff << std::endl;return true;}return false;}

创建时遇到的问题:
1.打印DOM的一个节点到缓冲区失败
2.打印DOM的一个节点到buff失败
在这里插入图片描述
解决办法:
在用这些函数的函数前 加个此函数的声明:

下面的注释都是后加的,解决了找不到的问题。
/*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_element_node(OutIt out, const xml_node<Ch>* node, int flags, int indent);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_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);*/template<class OutIt, class Ch>inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent){// Print proper node typeswitch (node->type()){// Documentcase node_document:out = print_children(out, node, flags, indent);break;// Elementcase node_element:out = print_element_node(out, node, flags, indent);break;// Datacase node_data:out = print_data_node(out, node, flags, indent);break;// CDATAcase node_cdata:out = print_cdata_node(out, node, flags, indent);break;// Declarationcase node_declaration:out = print_declaration_node(out, node, flags, indent);break;// Commentcase node_comment:out = print_comment_node(out, node, flags, indent);break;// Doctypecase node_doctype:out = print_doctype_node(out, node, flags, indent);break;// Picase node_pi:out = print_pi_node(out, node, flags, indent);break;// Unknowndefault:assert(0);break;}// If indenting not disabled, add line break after nodeif (!(flags & print_no_indenting))*out = Ch('\n'), ++out;// Return modified iteratorreturn out;}

2.创建自己的数据输出到xml文件

步骤:
1.创建各个节点,并设置属性,注意控制节点之间的父子关系;
2.创建输出流ofstream,用rapidxml::print方法将doc数据输入到buff中;
3.用outfile将buff数据导入到文件中。

bool Create(std::string filename)
{//DOMstd:: vector<std::string>::iterator it;rapidxml::xml_document<>doc;std::vector<std::string>tmp;tmp.push_back("Count");tmp.push_back("Step");tmp.push_back("Record");tmp.push_back("Record");std::vector<std::string>tmp1;tmp1.push_back("10");tmp1.push_back("100");tmp1.push_back("1000");tmp1.push_back("10000");2.node_declarationrapidxml::xml_node<>* declaration = doc.allocate_node(rapidxml::node_declaration);declaration->append_attribute(doc.allocate_attribute("version", "1.0"));declaration->append_attribute(doc.allocate_attribute("encoding", "utf-8"));doc.append_node(declaration);rapidxml::xml_node<>* Info = doc.allocate_node(rapidxml::node_element, "Info");doc.append_node(Info);rapidxml::xml_node<>* Settings = doc.allocate_node(rapidxml::node_element, "Settings");Info->append_node(Settings);std::vector<std::string>::iterator it1 = tmp1.begin();for (it = tmp.begin(); it != tmp.end(); it++) {rapidxml::xml_node<>* Count = doc.allocate_node(rapidxml::node_element,it->c_str());Count->append_attribute(doc.allocate_attribute("value", it1->c_str()));Settings->append_node(Count);it1++;}//analysis->append_node()rapidxml::xml_node<>* InstanceInfo = doc.allocate_node(rapidxml::node_element,"InstanceInfo");Info->append_node(InstanceInfo);for (int i = 0; i < 3; i++){rapidxml::xml_node<>* Instance = doc.allocate_node(rapidxml::node_element,"Instance");InstanceInfo->append_node(Instance);Instance->append_attribute(doc.allocate_attribute("id","1"));Instance->append_attribute(doc.allocate_attribute("name", "xxx"));Instance->append_attribute(doc.allocate_attribute("fun", "sin"));for (int j = 0; j < 2; j++){rapidxml::xml_node<>* Parameter = doc.allocate_node(rapidxml::node_element, "Parameter");Instance->append_node(Parameter);Parameter->append_attribute(doc.allocate_attribute("name", "own"));Parameter->append_attribute(doc.allocate_attribute("init", "1"));}}std::cout << doc;// error  为什么?std::ofstream outfile(filename, std::ios::out);if (outfile){char* end = rapidxml::print(buff, doc, 0);*end = 0;outfile << buff; //outfile.close();}return true;}
int main(){const char* file_name = "xxx.xml";bool res = Create(file_name);if (!res){return -1;}return 0;
}

成功输出数据到文件中
在这里插入图片描述

二、读取xml格式到buff

/*这几个文件都要在项目文件夹中,才可以调用库文件*/
#include "rapidxml_print.hpp"
#include "rapidxml_utils.hpp"
//#include "rapidxml_iterators.hpp"
//#include "rapidxml_iterators.hpp"
using namespace rapidxml;
static const int buff_len = 2048;
static char buff[buff_len] = { 0 };
bool Read()
{memset(buff, 0,buff_len);std::string filename = "demo.xml";//实例化文件读取流std::ifstream infile(filename, std::ios::in);if (!infile){std::cout << "file stream instance error!" << std::endl;return false;}//从流中读到buffinfile.read(buff, buff_len);std::cout << buff << std::endl;
}int main()
{bool res = Read();if (!res){return -1;}return 0;
}

在这里插入图片描述

注意此时的xml文件是否在工作目录下,通过右键项目->属性->调试,查看工作路径是否存在xml文件,路径对修改
例如:projectDir 改为OutDir 查看路径是否正确。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis持久化策略AOF、RDB详解及源码分析

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、Redis为什么要持久化 Redis 是一个内存数据库&#xff0c;就是将数据库中的内容保存在内存中&#xff0c;这与传统的MySQL&#xff0c;Oracle等关系型数据库直接将内容保存到硬盘中相比&#xff0c;内存数据库的读写效…

Gof23-创建型-工厂-单例-抽象工厂-建造-原型以及UML的绘制

创建型的设计模式工厂模式单例模式抽象工厂建造者模式原型模式UML图形的绘制工厂模式 工厂模式 Factory Pattern 适用的场景&#xff1a;统一的接口作为统一的零件&#xff0c;实现类作为零件的组合&#xff0c;将实例产品类的生产交给工厂&#xff0c;用户只需要面对工程提取…

Java_接口

目录 1.接口的语法规则 2.接口使用 3.接口特性 4.实现多个接口 1&#xff09;下面通过类来表示一组动物&#xff1b; 2&#xff09;另外再提供一组接口, 分别表示 "会跑的", "会飞的", "会游泳的"&#xff1b; 3&#xff09;接下来我们创建…

十九种卷积

参考文章:一文看尽深度学习中的20种卷积(附源码整理和论文解读) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/381839221 一、原始卷积(Vanilla Convolution) CNNs中的卷积,也称为滤波器,是由一组具有固定窗口大小且带可学习参数(learnable paramerters)的卷积核所组…

Unity 如何实现框选游戏战斗单位

文章目录&#x1f354; Preface✨ 如何在屏幕坐标系内绘制框选框&#x1f389; 根据框选范围定位其在世界坐标系中对应的区域&#x1f947; 在该区域内进行物理检测&#x1f354; Preface 本文简单介绍如何实现即时战略游戏中框选战斗单位的功能&#xff0c;如图所示&#xff…

【外卖项目实战开发二】

文章目录1、完善登录功能问题分析代码实现2、新增员工需求分析数据模型代码开发3、员工信息分页查询需求分析代码开发4、启用/禁用员工账号需求分析代码开发代码修复5、编辑员工信息需求分析代码开发1、完善登录功能 问题分析 前面我们已经完成了后台系统的员工登录功能开发&…

基于JavaWeb的婚恋交友网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

大数据:HDFS的Shell常用命令操作

文章目录一 HDFS的Shell介绍二 HDFS常用命令操作01 创建目录&#xff08;1&#xff09;创建单层目录&#xff08;3&#xff09;创建多层目录02 查看目录03 上传本地文件到HDFS04 查看文件内容05 下载HDFS文件到本地06 删除HDFS文件07 删除HDFS目录08 移动目录或文件09 文件合并…

第九章 堆排序与TOPK问题

第九章&#xff1a;堆排序与TOPK问题一、堆排序&#xff1a;1、思路分析&#xff1a;&#xff08;1&#xff09;建堆&#xff08;2&#xff09;排序2、堆排序模板二、TOPK问题&#xff1a;1、什么是TOPK问题&#xff1f;2、解决方法一、堆排序&#xff1a; 假设我们实现一个小…

26k Star, 理解Git太轻松了。。。

程序员宝藏库&#xff1a;gitee.com/sharetech_lee/CS-Books-Store Git是目前使用比较广泛一款版本控制工具&#xff0c;从事开发工作&#xff0c;很难绕开Git。 因此&#xff0c;关于如何快速学习Git使用一直都是一个经久不衰的话题。 前不久我在另外一篇文章中曾提到Git对初…

树莓派上搭建SVN服务器

目录 一、服务端安装步骤 1.安装svn 2.创建目录 3.创建版本仓库 4.修改配置&#xff08;authz,passwd,svnserve.conf&#xff09; 5.启动服务 二、tortoisSVN客户端安装 三、结束 一、服务端安装步骤 1.安装svn sudo apt-get install subversion 2.创建目录 sudo m…

用Python蹭别人家图片接口,做一个【免费图床】吧

打开本文&#xff0c;相信你确实需要一个免费且稳定的图床&#xff0c;这篇博客就让你实现。 文章目录⛳️ 谁家的图床⛳️ 实战编码⛳️ 第一轮编码⛳️ 第二轮编码⛳️ 第三轮编码⛳️ 第四轮编码⛳️ 谁家的图床 这次咱们用新浪微博来实现【免费图床应用】&#xff0c;通过…

基于keras 卷积神经外网络搭建的手写数字识别 完整代码+数据可直接运行

项目介绍: 适合新手入门学习代码数据很简洁 上结果: 主要的卷积神经网络: 卷积是指在滑动中提取特征的过程,可以形象地理解为用放大镜把每步都放大并且拍下来,再把拍下来的图片拼接成一个新的大图片的过程。 2D卷积是一个相当简单的操作: 我们先从一个小小的权重矩阵…

十个值得珍藏的正则表达式

正则表达式常学常忘&#xff0c;记规则不如记例子&#xff0c;记多不如记精&#xff0c;记例子就记最经典的。下面是本人珍藏的十个有用的正则表达式&#xff0c;不吝分享&#xff0c;以飨读者。 正则表达式要点 小括号&#xff1a;代表分组 中括号&#xff1a;代表集合 大括号…

外卖项目08---Linux

目录 一、 Linux简介 119 二、Linux安装 120 三、常用命令 122 3.1Linux命令初体验 3.1.1 command [-options] [parameter] 3.2Linux常用命令---文件目录操作命令-ls&-cd&-cat 124 3.2.1list 3.2.2 cd 3.2.3 cat 3.3 Linux常用命令---文件目录操作命令…

机器学习模型与backtrader框架整合

原创文章第116篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 北京疫情似乎还没有到拐点&#xff0c;但这三天结束后应该会到来。 今天重点说说&#xff0c;机器学习模型整合到我们的回测框架中&#xff0c;并与backtrader连接起来回测…

傻白入门芯片设计,先进封装技术(五)

集成电路芯片与封装之间是不可分割的整体。没有一个芯片可以不用封装就能正常工作&#xff0c;封装对芯片来说是必不可少的&#xff0c;随着IC生产技术的进步&#xff0c;封装技术也不断更新换代&#xff0c;每一代IC都与新一代的IC封装技术紧密相连。 目录 一、什么是封装&am…

详解设计模式:抽象工厂模式

工厂方法模式&#xff0c;又称工厂模式、多态工厂模式和虚拟构造器模式&#xff0c;通过工厂父类定义负责创建产品的公共接口&#xff0c;子类负责生产具体对象。可以理解为简单工程模式的升级&#xff0c;解决简单工厂模式的弊端。 &#xff5e; 本篇内容包括&#xff1a;关于…

java基本语法 下

目录 运算符 运算符&#xff1a;算术运算符 运算符&#xff1a;赋值运算符 运算符&#xff1a;比较运算符 运算符&#xff1a;逻辑运算符 运算符&#xff1a;三元运算符 运算符的优先级 程序流程控制 概念 顺序结构 if-else结构 switch-case结构 循环结构 循环结构…

你不能错过的【Python爬虫】测试3(爬取所有内容 + 完整源代码 + 架构 + 结果)

目录 一、主要工具包 以及 版本二、架构展示三、各部分code3.1 yjs.py (重要)3.2 items.py3.3 middlewares.py3.4 pipelines.py3.5 settings.py3.6 start.py四、结果展示一、主要工具包 以及 版本 scrapy:2.7.1版本(这里主要用到的工具包) 二、架构展示 三、各部分code 3…