一、写xml 文件

#include <iostream>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp" using namespace rapidxml; int main()
{
xml_document<> doc;
xml_node<>* rot = doc.allocate_node(rapidxml::node_pi,doc.allocate_string("xml version='1.0' encoding='utf-8'"));
doc.append_node(rot);
xml_node<>* node = doc.allocate_node(node_element,"config","information");
xml_node<>* color = doc.allocate_node(node_element,"color",NULL);
doc.append_node(node);
node->append_node(color);
color->append_node(doc.allocate_node(node_element,"red","0.1"));
color->append_node(doc.allocate_node(node_element,"green","0.1"));
color->append_node(doc.allocate_node(node_element,"blue","0.1"));
color->append_node(doc.allocate_node(node_element,"alpha","1.0")); xml_node<>* size = doc.allocate_node(node_element,"size",NULL);
size->append_node(doc.allocate_node(node_element,"x","640"));
size->append_node(doc.allocate_node(node_element,"y","480"));
node->append_node(size); xml_node<>* mode = doc.allocate_node(rapidxml::node_element,"mode","screen mode");
mode->append_attribute(doc.allocate_attribute("fullscreen","false"));
node->append_node(mode); 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>

写文件样例2:

#include <string>
#include <iostream>
#include <fstream>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp" using namespace rapidxml;
using namespace std; int main(int argc, char* argv[])
{ xml_document<> doc; //是解析器
char a[] = "<top>"//假设单独传, 就不能加上xml的头部信息,
//否则会报错
"<name>tangqiang</name>"
"<age>22</age>"
"</top>";
char* p = a;
doc.parse<0>(p); xml_node<>* node = doc.first_node();//去顶级结点
cout << (node->name())<< endl;
node = node->first_node();
while (node) {
cout << node->name() << node->value() << endl;//name() value()返回的字符串不会去掉首尾的空白字符
node = node->next_sibling();
} ofstream out("test.xml");//ofstream 默认时,假设文件存在则会覆盖原来的内容,不存在则会新建
out << doc;//doc 这样输出时在目标文件里不会有xml 头信息---<?xml version='1.0' encoding='utf-8' >
out.close();
system("pause");
return 0;
}

生成的xml例如以下

<top>
<name>tangqiang</name>
<age>22</age>
</top>

二、读取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; //! 加入�之后再次保存
//须要说明的是rapidxml明显有一个bug
//那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!
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为

<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>
<w>0</w>
<h>0</h>
</size>
<mode fullscreen="false">screen mode</mode>
</config>

三、删除节点

#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp" #include<iostream>
using namespace rapidxml; int main()
{
file<> fdoc("config.xml");
xml_document<> doc;
doc.parse<0>(fdoc.data()); std::string text;
rapidxml::print(std::back_inserter(text), doc, 0);
std::cout<<text<<std::endl; xml_node<>* root = doc.first_node(); xml_node<>* sec = root->first_node(); root->remove_node(sec); //移除根节点下的sec结点(包含该结点下全部结点)
text="删除一个节点\r\n";
rapidxml::print(std::back_inserter(text), doc, 0);
std::cout<<text<<std::endl; root->remove_all_nodes(); //移除根节点下全部结点
text="删除全部节点\r\n";
rapidxml::print(std::back_inserter(text), doc, 0);
std::cout<<text<<std::endl; std::ofstream out("test.xml");
out<<doc;
system("pause");
return 0;
}

输出信息例如以下:

<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>
<w>0</w>
<h>0</h>
</size>
<mode fullscreen="false">screen mode</mode>
</config> 删除一个节点 <config>
<size>
<x>640</x>
<y>480</y>
<w>0</w>
<h>0</h>
</size>
<mode fullscreen="false">screen mode</mode>
</config> 删除全部节点 <config/>

四、编辑节点信息

临时找到的编辑方法就是先删除再添加�

#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp" #include<iostream>
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();
xml_node<>* delnode = root->first_node("color");
root->remove_node(delnode);//先删除address节点
//
xml_node<>* lnode = root->first_node("size");//找到post节点
xml_node<>* mynode=doc.allocate_node(node_element,"address","河北");
root->insert_node(lnode,mynode); std::string text;
rapidxml::print(std::back_inserter(text),doc,0); std::cout<<text<<std::endl; std::ofstream out("version.xml");
out << doc;
system("pause");
return 0;
}

输出例如以下:

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

		<w>0</w>

		<h>0</h>

	</size>

	<mode fullscreen="false">screen mode</mode>

</config>

<config>
<address>河北</address>
<size>
<x>640</x>
<y>480</y>
<w>0</w>
<h>0</h>
</size>
<mode fullscreen="false">screen mode</mode>
</config>

五、遍历全部节点

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

六、遍历全部属性

for(rapidxml::xml_attribute<char> * attr = node->first_attribute("node name");
attr != NULL;
attr = attr->next_attribute())
{
char * value = attr->value();
}

七、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文件例如以下。

Index: rapidxml_print.hpp
===================================================================
--- rapidxml_print.hpp (revision 2025)
+++ rapidxml_print.hpp (revision 2080)
@@ -101,68 +101,9 @@ ///////////////////////////////////////////////////////////////////////////
// Internal printing operations
-
- // Print node
+
template<class OutIt, class Ch>
- inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
- {
- // Print proper node type
- switch (node->type())
- {
-
- // Document
- case node_document:
- out = print_children(out, node, flags, indent);
- break;
-
- // Element
- case node_element:
- out = print_element_node(out, node, flags, indent);
- break;
-
- // Data
- case node_data:
- out = print_data_node(out, node, flags, indent);
- break;
-
- // CDATA
- case node_cdata:
- out = print_cdata_node(out, node, flags, indent);
- break;
-
- // Declaration
- case node_declaration:
- out = print_declaration_node(out, node, flags, indent);
- break;
-
- // Comment
- case node_comment:
- out = print_comment_node(out, node, flags, indent);
- break;
-
- // Doctype
- case node_doctype:
- out = print_doctype_node(out, node, flags, indent);
- break;
-
- // Pi
- case node_pi:
- out = print_pi_node(out, node, flags, indent);
- break;
-
- // Unknown
- default:
- assert(0);
- break;
- }
-
- // If indenting not disabled, add line break after node
- if (!(flags & print_no_indenting))
- *out = Ch('\n'), ++out;
-
- // Return modified iterator
- return out;
- }
+ inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent); // Print children of the node
template<class OutIt, class Ch>
@@ -372,7 +313,69 @@
*out = Ch('>'), ++out;
return out;
}
+
+ // Print node
+ template<class OutIt, class Ch>
+ inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
+ {
+ // Print proper node type
+ switch (node->type())
+ { + // Document
+ case node_document:
+ out = print_children(out, node, flags, indent);
+ break;
+
+ // Element
+ case node_element:
+ out = print_element_node(out, node, flags, indent);
+ break;
+
+ // Data
+ case node_data:
+ out = print_data_node(out, node, flags, indent);
+ break;
+
+ // CDATA
+ case node_cdata:
+ out = print_cdata_node(out, node, flags, indent);
+ break;
+
+ // Declaration
+ case node_declaration:
+ out = print_declaration_node(out, node, flags, indent);
+ break;
+
+ // Comment
+ case node_comment:
+ out = print_comment_node(out, node, flags, indent);
+ break;
+
+ // Doctype
+ case node_doctype:
+ out = print_doctype_node(out, node, flags, indent);
+ break;
+
+ // Pi
+ case node_pi:
+ out = print_pi_node(out, node, flags, indent);
+ break;
+
+ // Unknown
+ default:
+ assert(0);
+ break;
+ }
+
+ // If indenting not disabled, add line break after node
+ if (!(flags & print_no_indenting))
+ *out = Ch('\n'), ++out;
+
+ // Return modified iterator
+ return out;
+ }
+
}
//! \endcond

RapidXml用法的更多相关文章

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

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

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

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

  3. C++中rapidxml用法

    转载:https://www.cnblogs.com/rainbow70626/p/7586713.html 解析xml是第三方库很多,例如:tingxml,这次学习一下rapidxml,rapidx ...

  4. 警惕rapidxml的陷阱:添加节点时,请保证变量的生命周期

    http://www.cnblogs.com/chutianyao/p/3246592.html 项目中要使用xml打包.解析协议,HQ指定了使用rapidxml--号称是最快的xml解析器. 功能很 ...

  5. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  6. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  7. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

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

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

  9. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

随机推荐

  1. Window.Event.KeyCode=13

    Window.Event.KeyCode=13是enter键处发windows事件,enter键的ASCII是13. <input type="password" name= ...

  2. 11、四大组件之二-Service高级(二)Native Service

    一.Service的分类 1.1>Android Service 使用Java编写在JVM中运行的服务 1.2>Native Service 使用C/C++完成的服务,一般在系统开始时完成 ...

  3. Java was started but returned exit code=13 C:\ProgramData\Oracle\Java\javapath\javaw.exe

    ---------------------------Eclipse---------------------------Java was started but returned exit code ...

  4. lightoj 1018 (状态压缩DP)

    设dp[s]表示状态s下所需要的线段的个数,s的二进制中第x位为1就表示该状态下第x个点没被线段覆盖.需要预处理出来在任意两点之间连线所覆盖点的状态O(n^3),然后记忆化搜索即可. #include ...

  5. 020自动化测试 PK 手动测试

    一.手工测试为什么不可替代 手工测试是不可替代的,因为人是具有很强只能判断能力的,而工具是相对机械缺乏思维能力的东西 工具是人开发出来的 二.手工测试不可替代的表现 测试用例的设计:需要tester有 ...

  6. Web网站常规测试方法

    功能测试 1. 安装测试: 安装过程中对于缺省安装目录及任意指定的安装目录,是否都能正确安装: 若是选择安装,查看能否实现其相应的功能: 在所有能中途退出安装的位置退出安装程序后,验证此程序并未安装成 ...

  7. Physics2D.Linecast中的参数layerMask

    static RaycastHit2D Linecast(Vector2 start, Vector2 end, int layerMask = DefaultRaycastLayers, float ...

  8. 使用C语言实现二维,三维绘图算法(3)-简单的二维分形

    使用C语言实现二维,三维绘图算法(3)-简单的二维分形 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...

  9. Cloudera Manager安装

    安装环境: 系统:CentOS 6.3 64位 虚拟机:VMWare

  10. 【译】 AWK教程指南 6在AWK程序中使用Shell命令

    awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将 ...