一、写xml 文件

  1. #include <iostream>
  2. #include "rapidxml/rapidxml.hpp"
  3. #include "rapidxml/rapidxml_utils.hpp"
  4. #include "rapidxml/rapidxml_print.hpp"
  5. using namespace rapidxml;
  6. int main()
  7. {
  8. xml_document<> doc;
  9. xml_node<>* rot = doc.allocate_node(rapidxml::node_pi,doc.allocate_string("xml version='1.0' encoding='utf-8'"));
  10. doc.append_node(rot);
  11. xml_node<>* node =   doc.allocate_node(node_element,"config","information");
  12. xml_node<>* color =   doc.allocate_node(node_element,"color",NULL);
  13. doc.append_node(node);
  14. node->append_node(color);
  15. color->append_node(doc.allocate_node(node_element,"red","0.1"));
  16. color->append_node(doc.allocate_node(node_element,"green","0.1"));
  17. color->append_node(doc.allocate_node(node_element,"blue","0.1"));
  18. color->append_node(doc.allocate_node(node_element,"alpha","1.0"));
  19. xml_node<>* size =   doc.allocate_node(node_element,"size",NULL);
  20. size->append_node(doc.allocate_node(node_element,"x","640"));
  21. size->append_node(doc.allocate_node(node_element,"y","480"));
  22. node->append_node(size);
  23. xml_node<>* mode = doc.allocate_node(rapidxml::node_element,"mode","screen mode");
  24. mode->append_attribute(doc.allocate_attribute("fullscreen","false"));
  25. node->append_node(mode);
  26. std::string text;
  27. rapidxml::print(std::back_inserter(text), doc, 0);
  28. std::cout<<text<<std::endl;
  29. std::ofstream out("config.xml");
  30. out << doc;
  31. system("PAUSE");
  32. return EXIT_SUCCESS;
  33. }

生成的xml如下

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. - <config>
  3. - <color>
  4. <red>0.1</red>
  5. <green>0.1</green>
  6. <blue>0.1</blue>
  7. <alpha>1.0</alpha>
  8. </color>
  9. - <size>
  10. <x>640</x>
  11. <y>480</y>
  12. </size>
  13. <mode fullscreen="false">screen mode</mode>
  14. </config>

写文件例子2:

  1. #include <string>
  2. #include <iostream>
  3. #include <fstream>
  4. #include "rapidxml/rapidxml.hpp"
  5. #include "rapidxml/rapidxml_utils.hpp"
  6. #include "rapidxml/rapidxml_print.hpp"
  7. using namespace rapidxml;
  8. using namespace std;
  9. int main(int argc, char* argv[])
  10. {
  11. xml_document<> doc; //是解析器
  12. char a[] = "<top>"//如果单独传, 就不能加上xml的头部信息,
  13. //否则会报错
  14. "<name>tangqiang</name>"
  15. "<age>22</age>"
  16. "</top>";
  17. char* p = a;
  18. doc.parse<0>(p);
  19. xml_node<>* node = doc.first_node();//去顶级结点
  20. cout << (node->name())<< endl;
  21. node = node->first_node();
  22. while (node) {
  23. cout << node->name() << node->value() << endl;//name() value()返回的字符串不会去掉首尾的空白字符
  24. node = node->next_sibling();
  25. }
  26. ofstream out("test.xml");//ofstream 默认时,如果文件存在则会覆盖原来的内容,不存在则会新建
  27. out << doc;//doc 这样输出时在目标文件中不会有xml 头信息---<?xml version='1.0' encoding='utf-8' >
  28. out.close();
  29. system("pause");
  30. return 0;
  31. }

生成的xml如下

  1. <top>
  2. <name>tangqiang</name>
  3. <age>22</age>
  4. </top>

二、读取xml文件

  1. #include <iostream>
  2. #include "rapidxml/rapidxml.hpp"
  3. #include "rapidxml/rapidxml_utils.hpp"
  4. #include "rapidxml/rapidxml_print.hpp"
  5. using namespace rapidxml;
  6. int main()
  7. {
  8. file<> fdoc("config.xml");
  9. std::cout<<fdoc.data()<<std::endl;
  10. xml_document<>   doc;
  11. doc.parse<0>(fdoc.data());
  12. std::cout<<doc.name()<<std::endl;
  13. //! 获取根节点
  14. xml_node<>* root = doc.first_node();
  15. std::cout<<root->name()<<std::endl;
  16. //! 获取根节点第一个节点
  17. xml_node<>* node1 = root->first_node();
  18. std::cout<<node1->name()<<std::endl;
  19. xml_node<>* node11 = node1->first_node();
  20. std::cout<<node11->name()<<std::endl;
  21. std::cout<<node11->value()<<std::endl;
  22. //! 添加之后再次保存
  23. //需要说明的是rapidxml明显有一个bug
  24. //那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!
  25. xml_node<>* size = root->first_node("size");
  26. size->append_node(doc.allocate_node(node_element,"w","0"));
  27. size->append_node(doc.allocate_node(node_element,"h","0"));
  28. std::string text;
  29. rapidxml::print(std::back_inserter(text),doc,0);
  30. std::cout<<text<<std::endl;
  31. std::ofstream out("config.xml");
  32. out << doc;
  33. system("PAUSE");
  34. return EXIT_SUCCESS;
  35. }

生成的xml为

  1. <config>
  2. <color>
  3. <red>0.1</red>
  4. <green>0.1</green>
  5. <blue>0.1</blue>
  6. <alpha>1.0</alpha>
  7. </color>
  8. <size>
  9. <x>640</x>
  10. <y>480</y>
  11. <w>0</w>
  12. <h>0</h>
  13. </size>
  14. <mode fullscreen="false">screen mode</mode>
  15. </config>

三、删除节点

  1. #include "rapidxml/rapidxml.hpp"
  2. #include "rapidxml/rapidxml_utils.hpp"
  3. #include "rapidxml/rapidxml_print.hpp"
  4. #include<iostream>
  5. using namespace rapidxml;
  6. int main()
  7. {
  8. file<> fdoc("config.xml");
  9. xml_document<> doc;
  10. doc.parse<0>(fdoc.data());
  11. std::string text;
  12. rapidxml::print(std::back_inserter(text), doc, 0);
  13. std::cout<<text<<std::endl;
  14. xml_node<>* root = doc.first_node();
  15. xml_node<>* sec = root->first_node();
  16. root->remove_node(sec); //移除根节点下的sec结点(包括该结点下所有结点)
  17. text="删除一个节点\r\n";
  18. rapidxml::print(std::back_inserter(text), doc, 0);
  19. std::cout<<text<<std::endl;
  20. root->remove_all_nodes(); //移除根节点下所有结点
  21. text="删除所有节点\r\n";
  22. rapidxml::print(std::back_inserter(text), doc, 0);
  23. std::cout<<text<<std::endl;
  24. std::ofstream out("test.xml");
  25. out<<doc;
  26. system("pause");
  27. return 0;
  28. }

输出信息如下:

  1. <config>
  2. <color>
  3. <red>0.1</red>
  4. <green>0.1</green>
  5. <blue>0.1</blue>
  6. <alpha>1.0</alpha>
  7. </color>
  8. <size>
  9. <x>640</x>
  10. <y>480</y>
  11. <w>0</w>
  12. <h>0</h>
  13. </size>
  14. <mode fullscreen="false">screen mode</mode>
  15. </config>
  16. 删除一个节点
  17. <config>
  18. <size>
  19. <x>640</x>
  20. <y>480</y>
  21. <w>0</w>
  22. <h>0</h>
  23. </size>
  24. <mode fullscreen="false">screen mode</mode>
  25. </config>
  26. 删除所有节点
  27. <config/>

四、编辑节点信息

暂时找到的编辑方法就是先删除再增加

  1. #include "rapidxml/rapidxml.hpp"
  2. #include "rapidxml/rapidxml_utils.hpp"
  3. #include "rapidxml/rapidxml_print.hpp"
  4. #include<iostream>
  5. using namespace rapidxml;
  6. int main()
  7. {
  8. file<> fdoc("config.xml");
  9. std::cout<<fdoc.data()<<std::endl;
  10. xml_document<> doc;
  11. doc.parse<0>(fdoc.data());
  12. std::cout<<doc.name()<<std::endl;
  13. //! 获取根节点
  14. xml_node<>* root = doc.first_node();
  15. xml_node<>* delnode = root->first_node("color");
  16. root->remove_node(delnode);//先删除address节点
  17. //
  18. xml_node<>* lnode = root->first_node("size");//找到post节点
  19. xml_node<>* mynode=doc.allocate_node(node_element,"address","河北");
  20. root->insert_node(lnode,mynode);
  21. std::string text;
  22. rapidxml::print(std::back_inserter(text),doc,0);
  23. std::cout<<text<<std::endl;
  24. std::ofstream out("version.xml");
  25. out << doc;
  26. system("pause");
  27. return 0;
  28. }

输出如下:

  1. <config>
  2. <color>
  3. <red>0.1</red>
  4. <green>0.1</green>
  5. <blue>0.1</blue>
  6. <alpha>1.0</alpha>
  7. </color>
  8. <size>
  9. <x>640</x>
  10. <y>480</y>
  11. <w>0</w>
  12. <h>0</h>
  13. </size>
  14. <mode fullscreen="false">screen mode</mode>
  15. </config>
  16. <config>
  17. <address>河北</address>
  18. <size>
  19. <x>640</x>
  20. <y>480</y>
  21. <w>0</w>
  22. <h>0</h>
  23. </size>
  24. <mode fullscreen="false">screen mode</mode>
  25. </config>

五、遍历所有节点

  1. for(rapidxml::xml_node<char> * node = parent_node->first_node("node name");
  2. node != NULL;
  3. node = node->next_sibling())
  4. {
  5. ...
  6. }

六、遍历所有属性

  1. for(rapidxml::xml_attribute<char> * attr = node->first_attribute("node name");
  2. attr != NULL;
  3. attr = attr->next_attribute())
  4. {
  5. char * value = attr->value();
  6. }

七、gcc使用-std=gnu++0x 编译rapidxml时会报错,错误信息大概如下

...rapidxml_print.hpp:120:23: error:

call to function 'print_element_node' thatis neither visible in the

template definition nor found byargument-dependent lookup

out = print_element_node(out, node, flags,indent);

^

...rapidxml_print.hpp:242:22: note:

'print_element_node' should be declaredprior to the call site or in

namespace 'rapidxml'

inline OutIt print_element_node(OutIt out,const xml_node<Ch> ...

在这里找到了解决方法。

经查,原来print_node()函数被其他函数调用,但在却未定义(在被调用函数后定义了),所以解决方法为把print_node()函数移到print_children(), print_element_node() 等函数的后面。在原定义处就留一个函数声明就行。

具体diff文件如下。

[plain] view plaincopy

  1. Index: rapidxml_print.hpp
  2. ===================================================================
  3. --- rapidxml_print.hpp  (revision 2025)
  4. +++ rapidxml_print.hpp  (revision 2080)
  5. @@ -101,68 +101,9 @@
  6. ///////////////////////////////////////////////////////////////////////////
  7. // Internal printing operations
  8. -
  9. -        // Print node
  10. +
  11. template<class OutIt, class Ch>
  12. -        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
  13. -        {
  14. -            // Print proper node type
  15. -            switch (node->type())
  16. -            {
  17. -
  18. -            // Document
  19. -            case node_document:
  20. -                out = print_children(out, node, flags, indent);
  21. -                break;
  22. -
  23. -            // Element
  24. -            case node_element:
  25. -                out = print_element_node(out, node, flags, indent);
  26. -                break;
  27. -
  28. -            // Data
  29. -            case node_data:
  30. -                out = print_data_node(out, node, flags, indent);
  31. -                break;
  32. -
  33. -            // CDATA
  34. -            case node_cdata:
  35. -                out = print_cdata_node(out, node, flags, indent);
  36. -                break;
  37. -
  38. -            // Declaration
  39. -            case node_declaration:
  40. -                out = print_declaration_node(out, node, flags, indent);
  41. -                break;
  42. -
  43. -            // Comment
  44. -            case node_comment:
  45. -                out = print_comment_node(out, node, flags, indent);
  46. -                break;
  47. -
  48. -            // Doctype
  49. -            case node_doctype:
  50. -                out = print_doctype_node(out, node, flags, indent);
  51. -                break;
  52. -
  53. -            // Pi
  54. -            case node_pi:
  55. -                out = print_pi_node(out, node, flags, indent);
  56. -                break;
  57. -
  58. -                // Unknown
  59. -            default:
  60. -                assert(0);
  61. -                break;
  62. -            }
  63. -
  64. -            // If indenting not disabled, add line break after node
  65. -            if (!(flags & print_no_indenting))
  66. -                *out = Ch('\n'), ++out;
  67. -
  68. -            // Return modified iterator
  69. -            return out;
  70. -        }
  71. +        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
  72. // Print children of the node
  73. template<class OutIt, class Ch>
  74. @@ -372,7 +313,69 @@
  75. *out = Ch('>'), ++out;
  76. return out;
  77. }
  78. +
  79. +        // Print node
  80. +        template<class OutIt, class Ch>
  81. +        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
  82. +        {
  83. +            // Print proper node type
  84. +            switch (node->type())
  85. +            {
  86. +            // Document
  87. +            case node_document:
  88. +                out = print_children(out, node, flags, indent);
  89. +                break;
  90. +
  91. +            // Element
  92. +            case node_element:
  93. +                out = print_element_node(out, node, flags, indent);
  94. +                break;
  95. +
  96. +            // Data
  97. +            case node_data:
  98. +                out = print_data_node(out, node, flags, indent);
  99. +                break;
  100. +
  101. +            // CDATA
  102. +            case node_cdata:
  103. +                out = print_cdata_node(out, node, flags, indent);
  104. +                break;
  105. +
  106. +            // Declaration
  107. +            case node_declaration:
  108. +                out = print_declaration_node(out, node, flags, indent);
  109. +                break;
  110. +
  111. +            // Comment
  112. +            case node_comment:
  113. +                out = print_comment_node(out, node, flags, indent);
  114. +                break;
  115. +
  116. +            // Doctype
  117. +            case node_doctype:
  118. +                out = print_doctype_node(out, node, flags, indent);
  119. +                break;
  120. +
  121. +            // Pi
  122. +            case node_pi:
  123. +                out = print_pi_node(out, node, flags, indent);
  124. +                break;
  125. +
  126. +                // Unknown
  127. +            default:
  128. +                assert(0);
  129. +                break;
  130. +            }
  131. +
  132. +            // If indenting not disabled, add line break after node
  133. +            if (!(flags & print_no_indenting))
  134. +                *out = Ch('\n'), ++out;
  135. +
  136. +            // Return modified iterator
  137. +            return out;
  138. +        }
  139. +
  140. }
  141. //! \endcond

RapidXml使用方法的更多相关文章

  1. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

  2. rapidxml读取包含中文路径的xml解析错误的解决方法

    from http://blog.csdn.net/qinwei4072880/article/details/38865179 1.rapidxml不支持中文路径. 2.rapidxml不支持Uni ...

  3. RAPIDXML 中文手册,根据官方文档完整翻译!

    简介:这个号称是最快的DOM模型XML分析器,在使用它之前我都是用TinyXML的,因为它小巧和容易上手,但真正在项目中使用时才发现如果分析一个比较大的XML时TinyXML还是表现一般,所以我们决定 ...

  4. rapidxml使用

    以前都是用tinyxml,这次开发中解析xml配置文件像尝试一下rapidxml,据说效率很高... RapidXml Manual: http://rapidxml.sourceforge.net/ ...

  5. RapidXml用法

    一.写xml 文件 #include <iostream> #include "rapidxml/rapidxml.hpp" #include "rapidx ...

  6. [xml解析]rapidxml读取文件

    因为项目需要读取xml配置文件,在原来调查一番后,项目组使用了tinyxml. tinyxml确实简单,非常清楚的就把读取方案写出来了.但是,由于后期xml文件越来越大(2.5M,大概1w多行数据), ...

  7. 利用c++操作XML,主要是内部循环方法的使用

    本文主要分享的是循环方法的使用,设置XML节点属性,用了3种循环方法. XML文件: <?xml version='1.0' encoding='utf-8' ?><root> ...

  8. rapidxml 序列化

    void TestRapidXml() { ]; sprintf(xmlContent,"<root><head>aaa</head><body&g ...

  9. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

随机推荐

  1. c basic library framework - simplec 2.0.0

    前言 - simplec 单元测试 流程介绍 一个关于C基础库 simplec 2.0.0 发布了. 详细的文档介绍请参照 README.md. 说的再多都无用, 抵不上 gdb 一个 b r n. ...

  2. java.util.ConcurrentModification并发修改异常

    在运行下面这段代码时出现了并发修改异常java.util.ConcurrentModification: public static void main(String[] args) { List l ...

  3. Django基础之form组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  4. Internet Explorer 浏览器在同一时刻只能从同一域名下载两个文件。

    Internet Explorer 浏览器在同一时刻只能从同一域名下载两个文件.至于原因请见 MSDN Blogs:<Internet Explorer and Connection Limit ...

  5. Java学习笔记(一)——关于java中的String类

    [前面的话] 毕业将近6个月了,试用期也快要过去了,期待接下来的日子.在金融类性质的机构,最痛苦的是也许就是大部分系统外包,所以比较少写代码,在这六个月中只写了1个月左右的代码,然后每天都在做一些比较 ...

  6. 【JBPM4】流程分支fork - join

    流程分支.聚合.流程每个分支节点都全部处理完成后,聚合到下一个节点. JPDL <?xml version="1.0" encoding="UTF-8"? ...

  7. javascript大神修炼记(3)——条件分支

    读者朋友们好,我们今天接着前面的讲,前面已经大概了讲了一下运算符,今天的任务主要就是讲解逻辑条件分支,循环. 我们先就来模拟一个逻辑块,就用我们经常接触到的买车票来说吧,车票的价格对不同的人价格是有差 ...

  8. Codeforces Round #496 (Div. 3) E2 - Median on Segments (General Case Edition)

    E2 - Median on Segments (General Case Edition) 题目大意:给你一个数组,求以m为中位数的区间个数. 思路:很巧秒的转换,我们把<= m 数记为1, ...

  9. 多线程下,Python Sqlite3报[SQLite objects created in a thread can only be used...]问题

    明明加了锁保护,还是出了下面的问题 ProgrammingError: SQLite objects created in a thread can only be used in that same ...

  10. ORACLE数据库创建动态表

    最近公司一个项目代码里的定时任务无法执行,查验代码良久,奈何代码过于老旧,开发人员换了一茬又一茬,现在都无法理清,故无奈只好到数据库里重新写存过,配置定时任务. 在写存过时,由于检测及安全性能要求,需 ...