转载:https://www.cnblogs.com/rainbow70626/p/7586713.html

解析xml是第三方库很多,例如:tingxml,这次学习一下rapidxml,rapidxml是一个快速的xml库,比tinyxml快了50-100倍。

这个库的下载地址为:官方网站:https://sourceforge.net/projects/rapidxml/

这个库源码一共只有四个文件分别是:

测试demo:

  1. #include <iostream>
  2. #include "rapidxml.hpp"
  3. #include "rapidxml_print.hpp"
  4. #include "rapidxml_utils.hpp"
  5.  
  6. using namespace rapidxml;
  7.  
  8. int CreateXml()
  9. {
  10. rapidxml::xml_document<> doc;
  11. rapidxml::xml_node<>* rot = doc.allocate_node(rapidxml::node_pi, doc.allocate_string("xml version='1.0' encoding='utf-8'"));
  12. doc.append_node(rot);
  13. rapidxml::xml_node<>* node = doc.allocate_node(rapidxml::node_element, "config", "information");
  14. doc.append_node(node);
  15. rapidxml::xml_node<>* color = doc.allocate_node(rapidxml::node_element, "color", NULL);
  16. node->append_node(color);
  17. color->append_node(doc.allocate_node(rapidxml::node_element, "red", "0.1"));
  18. color->append_node(doc.allocate_node(rapidxml::node_element, "green", "0.1"));
  19. color->append_node(doc.allocate_node(rapidxml::node_element, "blue", "0.1"));
  20. color->append_node(doc.allocate_node(rapidxml::node_element, "alpha", "1.0"));
  21. rapidxml::xml_node<>* size = doc.allocate_node(rapidxml::node_element, "size", NULL);
  22. size->append_node(doc.allocate_node(rapidxml::node_element, "x", ""));
  23. size->append_node(doc.allocate_node(rapidxml::node_element, "y", ""));
  24. node->append_node(size);
  25. rapidxml::xml_node<>* mode = doc.allocate_node(rapidxml::node_element, "mode", "screen mode");
  26. mode->append_attribute(doc.allocate_attribute("fullscreen", "false"));
  27. node->append_node(mode);
  28. std::string text;
  29. rapidxml::print(std::back_inserter(text), doc, );
  30. std::cout << text << std::endl;
  31. std::ofstream out("config2.xml");
  32. out << doc;
  33.  
  34. return ;
  35. }
  36.  
  37. //读取并修改config3.xml
  38. int ReadAndChangeXml()
  39. {
  40. rapidxml::file<> fdoc("config2.xml");
  41. std::cout << fdoc.data() << std::endl;
  42. rapidxml::xml_document<> doc;
  43. doc.parse<>(fdoc.data());
  44. std::cout << doc.name() << std::endl;
  45. //! 获取根节点
  46. rapidxml::xml_node<>* root = doc.first_node();
  47. std::cout << root->name() << std::endl;
  48. //! 获取根节点第一个节点
  49. rapidxml::xml_node<>* node1 = root->first_node();
  50. std::cout << node1->name() << std::endl;
  51. rapidxml::xml_node<>* node11 = node1->first_node();
  52. std::cout << node11->name() << std::endl;
  53. std::cout << node11->value() << std::endl;
  54. //! 修改之后再次保存
  55. rapidxml::xml_node<>* size = root->first_node("size");
  56. size->append_node(doc.allocate_node(rapidxml::node_element, "w", ""));
  57. size->append_node(doc.allocate_node(rapidxml::node_element, "h", ""));
  58. std::string text;
  59. rapidxml::print(std::back_inserter(text), doc, );
  60. std::cout << text << std::endl;
  61. std::ofstream out("../config/config2.xml");
  62. out << doc;
  63.  
  64. return ;
  65. }
  66.  
  67. void createxml()
  68. {
  69. xml_document<> doc;
  70. xml_node<>* root = doc.allocate_node(node_pi, doc.allocate_string("xml version='1.0' encoding='utf-8'"));
  71. doc.append_node(root);
  72.  
  73. xml_node<>* node = doc.allocate_node(node_element, "config", "information");
  74. doc.append_node(node);
  75.  
  76. xml_node<>* color = doc.allocate_node(node_element, "color", NULL);
  77. node->append_node(color);
  78. color->append_node(doc.allocate_node(node_element, "red", "0.1"));
  79. color->append_node(doc.allocate_node(node_element, "green", "0.1"));
  80. color->append_node(doc.allocate_node(node_element, "blue", "0.1"));
  81. color->append_node(doc.allocate_node(node_element, "alpha", "0.1"));
  82.  
  83. xml_node<>* size = doc.allocate_node(node_element, "size",NULL);
  84. node->append_node(size);
  85. size->append_node(doc.allocate_node(node_element, "x", ""));
  86. size->append_node(doc.allocate_node(node_element, "y", ""));
  87. xml_node<>* mode = doc.allocate_node(rapidxml::node_element, "mode", "screen mode");
  88. mode->append_attribute(doc.allocate_attribute("fullscreen", "false"));
  89. node->append_node(mode);
  90. std::string text;
  91. rapidxml::print(std::back_inserter(text), doc, );
  92. std::cout << text << std::endl;
  93. std::ofstream out("config.xml");
  94. out << doc;
  95. }
  96.  
  97. void readAndChangexml()
  98. {
  99. file<> fdoc("config.xml");
  100.  
  101. xml_document<> doc;
  102. std::cout << fdoc.data() << std::endl;
  103. //doc.parse<0>(fdoc.data());//修改节点值不会保存到文件中
  104. doc.parse<rapidxml::parse_no_data_nodes>(fdoc.data());//修改节点值会保存到文件中
  105. std::cout << "///" << std::endl;
  106. std::cout << doc.name() << std::endl;
  107.  
  108. //获取根节点
  109. xml_node<>* root = doc.first_node();
  110. std::cout << root->name() << std::endl;
  111.  
  112. //! 获取根节点第一个节点
  113. xml_node<>* node1 = root->first_node();
  114. std::cout << node1->name() << std::endl;
  115.  
  116. xml_node<>* size = root->first_node("size");
  117.  
  118. xml_node<>* x = size->first_node("x");
  119. x->value("");
  120.  
  121. std::cout << size->first_node("x")->value() << std::endl;
  122.  
  123. std::string text;
  124. print(std::back_inserter(text), doc, );
  125. std::cout << text << std::endl;
  126. std::ofstream out("config.xml");
  127. out << doc;
  128. }
  129.  
  130. int main()
  131. {
  132. //createxml();
  133. readAndChangexml();
  134. //CreateXml();
  135. //system("pause");
  136. return ;
  137. }

C++中rapidxml用法的更多相关文章

  1. C++中rapidxml用法及例子

    rapidxml是一个快速的xml库,比tinyxml快了50-100倍.本文给出创建.读取.写入xml的源码. 由于新浪博客不支持文本文件上传,在使用下面代码需要先下载 rapidxml,关于这个库 ...

  2. C++中rapidxml用法及例子(源码)

    rapidxml是一个快速的xml库,比tinyxml快了50-100倍.本文给出创建.读取.写入xml的源码.      由于新浪博客不支持文本文件上传,在使用下面代码需要先下载 rapidxml, ...

  3. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  4. ORACLE 中ROWNUM用法总结(转)

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  5. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  6. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  7. .NET3.5中JSON用法以及封装JsonUtils工具类

    .NET3.5中JSON用法以及封装JsonUtils工具类  我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便.简单.强大且重用性高的效果. 首先创建一个类 ...

  8. ORACLE 中ROWNUM用法总结!

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  9. Android开发中Bundle用法包裹数据(转)

    Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...

随机推荐

  1. 浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  2. BBS之文章详情页搭建

    博客评论相关 博客文章详情页搭建 {% extends 'base.html' %} {% block css %} <style> #div_digg { float: right; m ...

  3. 自动化渗透测试工具(Cobalt Strike)3.1 最新破解版

    自动化渗透测试工具(Cobalt Strike)3.1 最新破解版[附使用教程] Cobalt Strike是一款专业的自动化渗透测试工具,它是图形化.可视化的,图形界面非常友好,一键傻瓜化使用MSF ...

  4. python __getattr__ & __getattribute__ 学习

    实例属性的获取和拦截, 仅对实例属性(instance, variable)有效, 非类属性 getattr: 适用于未定义的属性, 即该属性在实例中以及对应的类的基类以及祖先类中都不存在 1. 动态 ...

  5. JavaSE理论篇

    将已学过的知识记录在此,既能便于以后温习又能方便知识共享,做到共同成长. 计算机语言发展简史 主要分为三个阶段 机器语言:打点机,有点表示1,没有表示0,打点计时器 低级语言:汇编语言 高级语言:Ja ...

  6. HDU3572 Task Schedule(最大流+构图思维)

    题意: 有N个任务M个机器,给每个任务i完成所花费的时间Pi且每个任务要在第Si天后开始,在第Ei天前结束,保证任务在(S,E)之间一定能完成. 每个机器在一天里只能运行一个任务,一个任务可以在中途更 ...

  7. centos设置开机自启动脚本

    1.新建脚本文件 我这里是为了设置开机自动设置ipv6隧道,所以命名为ipv6tunnel.sh ifconfig sit0 up ifconfig sit0 inet6 tunnel ::66.22 ...

  8. error: ‘Poco::UInt16’ has not been declared

    碰到Poco库和其他第三方库共用的时候,当include-POCO库的头文件的时候,此时也include-其他库,导致这个报错. 原因是在这两个库中都对 UINT16 定义,导致冲突. 可以把这两个库 ...

  9. git 学习笔记 —— 获取远端分支并修改后提交至远端仓库

    笔者最近进行开发过程中,所有参与者的代码需要通过 git 上传到远端仓库中,不同的模块对应不同的 git 分支,不同模块的数据需要从远端仓库中获取.这里记录下笔者从远端仓库中获取分支数据,进行修改,最 ...

  10. js的对象创建

    创建对象 字面量的方式: var myHonda = {color: "red", wheels: 4, engine: {cylinders: 4, size: 2.2}} 就是 ...