使用 rapidxml 做配置文件
对于配置文件,一般会选用ini,xml 等等的配置格式。如何快速高效的从文件内读取自己想要的信息是每个做配置文件想要达到的效果。对以小型开发我们并不用时用到msxml这种重量级的解析器。那样会给自己添麻烦的。这里我推荐大家使用rapidxml。
之前使用tinyxml 感觉还可以。后看了rapidxml 就想换用这个开源库。经常编写跨平台软件省去编译和加载lib。4个文件实现解析xml而且超高效官网还拿他跟strlen比较速度牛X吧看看下面的表。
其他废话我就不多讲。其实之前也有人介绍这个库怎么使用。这里我就给几个链接。
燕良博客:http://blog.csdn.net/Neil3D/archive/2010/03/11/5369173.aspx
官网:http://rapidxml.sourceforge.net/
如果不懂xml的概念的朋友自己到网上找下相关的教程学习下。这里我简单的介绍下各个文件的作用:自己留个底怕以后自己会忘。
库可以配置宏:
RAPIDXML_NO_EXCEPTIONS //不使用异常
RAPIDXML_STATIC_POOL_SIZE //内存池大小默认(64 * 1024)
一般都不用改
rapidxml.hpp:
只要文件 实现内存池 解析string 异常处理
xml_base 基数节点类
xml_attribute 文本类
xml_node 节点类
xml_document 文档类
rapidxml_iterators.hpp:
提供两个迭代器类:node_iterator, attribute_iterator
rapidxml_print.hpp:
提供跟字符串,流对象的装换函数
rapidxml_utils.hpp:
提供一个file用来读取文件使用
跟两个计数函数 count_children,count_attributes
节点类型源码讲的很清楚
- //! Enumeration listing all node types produced by the parser.
- //! Use xml_node::type() function to query node type.
- enum node_type
- {
- node_document, //!< A document node. Name and value are empty.
- node_element, //!< An element node. Name contains element name. Value contains text of first data node.
- node_data, //!< A data node. Name is empty. Value contains data text.
- node_cdata, //!< A CDATA node. Name is empty. Value contains data text.
- node_comment, //!< A comment node. Name is empty. Value contains comment text.
- node_declaration, //!< A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes.
- node_doctype, //!< A DOCTYPE node. Name is empty. Value contains DOCTYPE text.
- node_pi //!< A PI node. Name contains target. Value contains instructions.
- };
简单操作:
- #include <iostream>
- #include <string>
- #include <rapidxml/rapidxml.hpp>
- #include <rapidxml/rapidxml_utils.hpp>
- #include <rapidxml/rapidxml_print.hpp>
- using namespace std;
- int main()
- {
- using namespace rapidxml;
- xml_document<> doc;
- xml_node<> *node = doc.allocate_node(node_element,"a","Google公司");
- doc.append_node(node);
- xml_attribute<> *attr = doc.allocate_attribute("href","google.com");
- node->append_attribute(attr);
- //直接输出
- cout<<"print:doc"<<doc<<endl;
- //用保存到string
- string strxml;
- print(std::back_inserter(strxml),doc,0);
- cout<<"print:strxml"<<strxml<<endl;
- //支持c风格的这里不演示,自己看文档吧
- return 0;
- }
运行结果:
读取文件(这里是从其他拷过来我刚学的时候就保存下来了,忘了在那里考的网上有好几个位兄弟都有的感觉,我也借来用用):
基本的步骤为
首先获取xml文件数据
然后分析数据
获取节点
获取属性
获取名字
获取值
...
代码如下:
- #include <iostream>
- #include <rapidxml/rapidxml.hpp>
- #include <rapidxml/rapidxml_utils.hpp>
- #include <rapidxml/rapidxml_print.hpp>
- using namespace rapidxml;
- int main()
- {
- file<> fdoc("config.xml");
- std::cout<<fdoc.data()<<std::endl;
- xml_document<> doc;
- doc.parse<0>(fdoc.data());
- std::cout<<doc.name()<<std::endl;
- //! 获取根节点
- xml_node<>* root = doc.first_node();
- std::cout<<root->name()<<std::endl;
- //! 获取根节点第一个节点
- xml_node<>* node1 = root->first_node();
- std::cout<<node1->name()<<std::endl;
- xml_node<>* node11 = node1->first_node();
- std::cout<<node11->name()<<std::endl;
- std::cout<<node11->value()<<std::endl;
- //! 修改之后再次保存
- xml_node<>* size = root->first_node("size");
- size->append_node(doc.allocate_node(node_element,"w","0"));
- size->append_node(doc.allocate_node(node_element,"h","0"));
- std::string text;
- rapidxml::print(std::back_inserter(text),doc,0);
- std::cout<<text<<std::endl;
- std::ofstream out("config.xml");
- out << doc;
- system("PAUSE");
- return EXIT_SUCCESS;
- }
- 生成的xml为:
- <?xml version='1.0' encoding='utf-8' ?>
- <config>
- <color>
- <red>0.1</red>
- <green>0.1</green>
- <blue>0.1</blue>
- <alpha>1.0</alpha>
- </color>
- <size>
- <x>640</x>
- <y>480</y>
- </size>
- <mode fullscreen="false">screen mode</mode>
- </config>
需要说明的是rapidxml明显有一个bug
那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!
使用 rapidxml 做配置文件相关推荐
- yaml,json,ini这三种格式用来做配置文件优缺点
适合人类编写:ini > toml > yaml > json > xml > plist 可以存储的数据复杂度:xml > yaml > toml ~ js ...
- include做配置文件
php有一个include,顾名思义,就是用来包含文件的.相应的还有require,以及两个带once的.不知道大家有没有注意过include的返回值.通常情况下,包含成功返回1,包含失败返回fals ...
- xml做配置文件 php,使用 PHP 处理 XML 配置文件
使用 PHP 处理 XML 配置文件 使用 PHP 处理 XML 配置文件 使用 XML 配置文件轻易地配置 PHP 应用程序和对象 级别: 中级 Vikram Vaswani, 创始人, Melon ...
- Nacos配置中心yml做配置文件Could not resolve placeholder ‘xxx’ in value ‘${xxx}’问题解决
从SpringCloudConfig跳到Nacos做配置中心,结果今天遇到了一个大坑,着实让我难受了一把 问题如下: 1,错误一 ,就是本地bootstrap.yml配置文件的 与 nacos 服务端 ...
- sudo配置文件详解及实战
2019独角兽企业重金招聘Python工程师标准>>> 安装NGINX之后每次都需要切换ROOT用户做配置文件修改和启动,为了加强安全,ROOT用户一般是不允许直接提供给应用开发人员 ...
- SpringBoot配置文件YAML
一.简介 SpringBoot使用一个全局的配置文件,配置文件名是固定的,主要有两种格式:properties和yml application.properties application.yml 配 ...
- ini配置文件的读取
.ini 文件是Initialization File的缩写,即初始化文件.是windows的系统配置文件所采用的存储格式,统管windows的各项配置,一般用户就用windows提供的各项图形化管理 ...
- yml语法规则 (5.spring boot配置文件注入@ConfigurationProperties)、配置文件处理器...
applicationi.properties application.yml 以数据为中心,比json xml更适合做配置文件 k: v 表示一对键值对 空格缩进控制层级关系,左对齐的一列数据都 ...
- Spring Boot 配置文件 yml与properties
原文链接:https://blog.csdn.net/qq_33524158/article/details/79600434 1.配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固 ...
最新文章
- ABAP实现粘贴板的操作,复制粘贴
- iOS GoldRaccoon第三方FTP文件夹下载失败原因
- mysql创建独立表空间_InnoDB独立表空间
- 【OpenCV 例程200篇】86. 频率域滤波应用:指纹图像处理
- svn删除文件或目录后提交失败及解决
- 30 多个有内味道且笑死的人代码注释
- android studio运行项目快捷键,Android Studio 快捷键大全
- js 文件上传 图片上传 传输速度计算
- Scratch编程入门-画图模块1【认识画图模块积木】
- poe工业以太网交换机可以当普通交换机用吗,poe工业以太网交换机有哪些优势
- python四子棋游戏
- 输入一个由小写字母组成的字符串, 按照26个字母表顺序进行排序,打印排序后的字符串;
- java 用户名称中emoji表情包的模糊处理
- bzoj 3039 玉蟾宫 单调栈
- Unity入门操作_2D动画播放_038
- 满满的骚操作,通用流行框架大全
- 微信公众号自定义菜单跳转到历史消息页面
- 文章资源下载——百度云
- linux服务器上的回收站,为linux系统实现回收站
- 日语翻译器-日语翻译器软件-日语翻译器排行榜
热门文章
- Map-Reduce的逻辑过程
- vue-获取某个组件渲染的Dom根元素
- php layui 上传文件,laravel使用layui 上传文件 支持pdf上传
- 股上涨和下跌天数比_面对下跌,如何信心十足地逢低买入?
- 超级强大的socket工具ss,替代netstat
- 解决导入myeclipse的项目注释和中文是乱码
- 第九周(11.02-11.08)学习笔记
- [转]宝文!Apple Push Notification Service (APNS)原理与实现方案
- Spring Cloud面试题
- 文件共享服务器地址格式,文件共享服务器配置