使用 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

 

节点类型源码讲的很清楚

[cpp] view plaincopy
  1.     //! Enumeration listing all node types produced by the parser.  
  2.   
  3.     //! Use xml_node::type() function to query node type.  
  4.   
  5.     enum node_type  
  6.   
  7.     {  
  8.   
  9.         node_document,     //!< A document node. Name and value are empty.  
  10.   
  11.         node_element,      //!< An element node. Name contains element name. Value contains text of first data node.  
  12.   
  13.         node_data,        //!< A data node. Name is empty. Value contains data text.  
  14.   
  15.         node_cdata,       //!< A CDATA node. Name is empty. Value contains data text.  
  16.   
  17.         node_comment,    //!< A comment node. Name is empty. Value contains comment text.  
  18.   
  19.         node_declaration,  //!< A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes.  
  20.   
  21.         node_doctype,     //!< A DOCTYPE node. Name is empty. Value contains DOCTYPE text.  
  22.   
  23.         node_pi          //!< A PI node. Name contains target. Value contains instructions.  
  24.   
  25. };  
  

简单操作:

 

[cpp] view plaincopy
  1. #include <iostream>  
  2.   
  3. #include <string>  
  4.   
  5. #include <rapidxml/rapidxml.hpp>  
  6.   
  7. #include <rapidxml/rapidxml_utils.hpp>  
  8.   
  9. #include <rapidxml/rapidxml_print.hpp>  
  10.   
  11.    
  12.   
  13. using namespace std;  
  14.   
  15.    
  16.   
  17. int main()  
  18.   
  19. {  
  20.   
  21.     using namespace rapidxml;  
  22.   
  23.     xml_document<> doc;  
  24.   
  25.     xml_node<> *node = doc.allocate_node(node_element,"a","Google公司");  
  26.   
  27.     doc.append_node(node);  
  28.   
  29.    
  30.   
  31.     xml_attribute<> *attr = doc.allocate_attribute("href","google.com");  
  32.   
  33.     node->append_attribute(attr);  
  34.   
  35.    
  36.   
  37.     //直接输出  
  38.   
  39.     cout<<"print:doc"<<doc<<endl;  
  40.   
  41.    
  42.   
  43.     //用保存到string  
  44.   
  45.     string strxml;  
  46.   
  47.     print(std::back_inserter(strxml),doc,0);  
  48.   
  49.     cout<<"print:strxml"<<strxml<<endl;  
  50.   
  51.    
  52.   
  53.     //支持c风格的这里不演示,自己看文档吧  
  54.   
  55.     return 0;  
  56.   
  57. }  

运行结果:

 

 

 

读取文件(这里是从其他拷过来我刚学的时候就保存下来了,忘了在那里考的网上有好几个位兄弟都有的感觉,我也借来用用):

 

基本的步骤为
首先获取xml文件数据
然后分析数据
获取节点
获取属性
获取名字
获取值
...

代码如下:

[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <rapidxml/rapidxml.hpp>  
  3. #include <rapidxml/rapidxml_utils.hpp>  
  4. #include <rapidxml/rapidxml_print.hpp>  
  5.    
  6. using namespace rapidxml;  
  7.   
  8. int main()  
  9. {      
  10.      file<> fdoc("config.xml");  
  11.      std::cout<<fdoc.data()<<std::endl;   
  12.      xml_document<>  doc;      
  13.      doc.parse<0>(fdoc.data());   
  14.   
  15.      std::cout<<doc.name()<<std::endl;  
  16.        
  17.      //! 获取根节点  
  18.      xml_node<>* root = doc.first_node();  
  19.      std::cout<<root->name()<<std::endl;  
  20.   
  21.      //! 获取根节点第一个节点  
  22.      xml_node<>* node1 = root->first_node();  
  23.      std::cout<<node1->name()<<std::endl;   
  24.   
  25.      xml_node<>* node11 = node1->first_node();  
  26.      std::cout<<node11->name()<<std::endl;  
  27.      std::cout<<node11->value()<<std::endl;  
  28.        
  29.      //! 修改之后再次保存  
  30.      xml_node<>* size = root->first_node("size");  
  31.      size->append_node(doc.allocate_node(node_element,"w","0"));  
  32.      size->append_node(doc.allocate_node(node_element,"h","0"));  
  33.   
  34.      std::string text;    
  35.      rapidxml::print(std::back_inserter(text),doc,0);    
  36.    
  37.      std::cout<<text<<std::endl;   
  38.       
  39.      std::ofstream out("config.xml");  
  40.      out << doc;  
  41.   
  42.      system("PAUSE");  
  43.      return EXIT_SUCCESS;  
  44. }  

 

[xhtml] view plaincopy
  1. 生成的xml为:  
  2.   
  3. <?xml version='1.0' encoding='utf-8' ?>  
  4. <config>  
  5.     <color>  
  6.         <red>0.1</red>  
  7.         <green>0.1</green>  
  8.         <blue>0.1</blue>  
  9.         <alpha>1.0</alpha>  
  10.     </color>  
  11.     <size>  
  12.         <x>640</x>  
  13.         <y>480</y>  
  14.     </size>  
  15.     <mode fullscreen="false">screen mode</mode>  
  16. </config>  

 

需要说明的是rapidxml明显有一个bug
那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!

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

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

相关文章

水晶报表实现(一)

WINFORM下创建水晶报表&#xff1a; 1、新建一个“windows应用程序” 2、添加一个数据集&#xff08;.xsd&#xff09;文件&#xff0c;它是ADO.NET数据集&#xff0c;数据集用于在断开缓存中存储数据&#xff0c;它的结构类似于关系数据库的接口&#xff0c;它公开表、行和列的…

Java swing 实现下拉框和文本框同步显示

想要MyEclipse中的swing中实现下拉框和文本框实现&#xff0c;对下拉框创建MouseEvent、ItemEvent、ActionEvent private void xingbieMouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: setSelectedItem(evt, this.xingbie1); } private v…

python image 转成字节_就是这么流弊!三行Python代码,让数据处理速度提高2到6倍

选自TowardsDataScience作者&#xff1a;George Seif本文转自机器之心(nearhuman2014)本文可以教你仅使用 3 行代码&#xff0c;大大加快数据预处理的速度。Python 是机器学习领域内的首选编程语言&#xff0c;它易于使用&#xff0c;也有很多出色的库来帮助你更快处理数据。但…

LSGO软件技术团队内部技术交流【2015-2016(1)第七周】

LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

python beautiful soup 标签完全相同_Python爬取Python教程并制作成pdf

欢迎点击右上角关注小编&#xff0c;除了分享技术文章之外还有很多福利&#xff0c;私信学习资料可以领取包括不限于Python实战演练、PDF电子文档、面试集锦、学习资料等。想要把教程变成PDF有三步&#xff1a;1、先生成空html&#xff0c;爬取每一篇教程放进一个新生成的div&a…

LSGO软件技术团队2015~2016学年第八周(1019~1025)总结

LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

ENVI计算公式(一)

<1>大于1的值赋予1&#xff0c;小于0的值赋予0 ((b1 lt 0)*(0)(b1 ge 0)*b1)or((b1 gt 1)*(1)(b1 ge 0)*b1) <2>modis数据计算ndvi b1*0.0001 <3>modis数据计算地表温度&#xff08;单位&#xff1a;摄氏度&#xff09; b1*0.02-273.15 <4>modis数据…

list取数据_Day.5利用Pandas做数据处理(二)

数据合并使用Join()合并&#xff0c;合并的方式是根据行和行进行合并。# 使用join合并&#xff0c;着重关注的是 行的合并import pandas as pd df1pd.DataFrame({Red:[1,3,5],Green:[5,0,3]},indexlist(abc))df2pd.DataFrame({Blue:[1,9,8],Yellow:[6,6,7]},indexlist(cde))pri…

MRP的数据处理-华北水利水电大学(作业)

这是之前学经济方向的同学让我利用C语言写的关于MRP的数据处理的过程&#xff0c;在用C语言写的过程中利用了动态数组使得时区不仅限于这8时区&#xff0c;有相关的同学可以进行查看 代码运行结果如下&#xff08;该代码可以自动调整参数&#xff0c;时区可以设置8天以上&#…

LSGO软件技术团队2015~2016学年第九周(1026~1101)总结

简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养…

git 每次都要输入用户名密码_Git向GitHub提供代码

一.前期准备工作首先建立一个GitHub账号&#xff0c;这个账号和密码邮箱要记住&#xff0c;如果忘记了也可以找回&#xff0c;会麻烦一些。在官网下载一个Git,可以自己根据默认进行安装&#xff0c;这样也是没有问题的&#xff0c;如果系统盘的空间不够大&#xff0c;可以安装到…

C# Socket 入门5 UPD 结构体 与 C++ 通信

1. 同样&#xff0c; 我们先看看这一个比简单的 结构体 代码 usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;namespaceCSharp_Socket_5{ ///<summary>///通信消息格式 ///</summary>[Serializable] …

坐标点获取并显示

在工作当中经常遇到根据名称获得相应坐标的情况,我们可以利用百度地图api来获取对应地点的坐标。 例如: 目前我们手中有需要获取大学坐标的名称,想要获取其坐标,并将其进行可视化显示。 以下是要查询的大学名称(现实当中可以是几千条数据) 以下是我们查询的结果 …

LSGO软件技术团队2015~2016学年第十周(1102~1108)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校…

matlab中GUI的属性检查器中的XLimMode是什么_如何在Matlab中使用GUI做一个简易音乐播放器? ---- (二)GUIDE...

咕咕怪由于昨天有重要的事情所以咕了一天的文章 &#xff08;感觉写得挺基础的&#xff0c;对各个部分有一定了解的童鞋可以直接跳过了解的部分用Matlab做一个app有几种办法呢&#xff1f;同样的&#xff0c;帮助文档告诉了我们答案&#xff1a;三种。英语好的童鞋看完这张图应…

DDMMSS.SS转为DD

有时候甲方会给我们一些坐标&#xff0c;但是在arcgis中是无法直接显示的 这是因为该格式是DDMMSS.SS的格式&#xff0c;而arcgis支持的是DD格式的&#xff0c;其中dd单位是度&#xff0c;mm单位是分&#xff0c;ss.ss单位是秒 所以要在arcgis中显示我们需要将其转换为DD的格式…

LSGO软件技术团队2015~2016学年第十一周(1109~1115)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…

maven springboot 除去指定的jar包_SpringBoot的运行机制

SpringBoot打包机制先看一眼spring-boot的maven插件打包后的target目录&#xff1a;其中有一个.jar.original的文件&#xff0c;一个.jar文件&#xff0c;其中.jar.original才是原始的jar包&#xff0c;而.jar文件是经过spring-boot的maven插件处理过后的jar&#xff0c;spring…

TVDI计算流程

TVDI计算过程 下载数据的网站: https://ladsweb.modaps.eosdis.nasa.gov/search/ 所需数据modis的16天的ndvi数据(MOD13A2)和每8天的LST数据(MOD11A2) 北半球选择Terra,南半前选择Aqua,因为两个卫星旋转是相对的,太阳高度角不同,会有些许误差 利用modis处理工具(MRT)…

LSGO软件技术团队2015~2016学年第十二周(1116~1122)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…