RapidXml用法

一、写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用法,布布扣,bubuko.com

时间: 2024-10-03 00:45:06

RapidXml用法的相关文章

C++中rapidxml用法及例子

rapidxml是一个快速的xml库,比tinyxml快了50-100倍.本文给出创建.读取.写入xml的源码. 由于新浪博客不支持文本文件上传,在使用下面代码需要先下载 rapidxml,关于这个库的下载地址为:官方网站: http://rapidxml.sourceforge.net/,这个库源码一共只有四个文件分别是: 关于raidxml资料相关的介绍网上有很多资料,在这里我就不重复介绍了,下面直接贴代码: #include "stdafx.h" #include "s

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

rapidxml是一个快速的xml库,比tinyxml快了50-100倍.本文给出创建.读取.写入xml的源码. 由于新浪博客不支持文本文件上传,在使用下面代码需要先下载 rapidxml,关于这个库的下载地址为:官方网站:https://sourceforge.net/projects/rapidxml/,这个库源码一共只有四个文件分别是: 关于raidxml资料相关的介绍网上有很多资料,在这里我就不重复介绍了,下面直接贴代码: #include "stdafx.h" #includ

Tinyxml简单使用法

1.概要介绍一下: 尝试了tinyxml,rapidxml,libxml2等3中第3方库,前两者相对较为轻量级,libxml2非常完善,强大. 这是网上总结出来的优缺点: 1.tinyxml当节点内容的空而使用GetText()方法时候会出错 2.rapidxml编码问题不是特别好 3.libxml2对内存释放要求较高,否则时常遇到core dump. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在

js中获取时间new date()的用法

js中获取时间new date()的用法 获取时间:   var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份(4位,1970-????) 3 myDate.getMonth(); //获取当前月份(0-11,0代表1月) 4 myDate.getDate(); //获取当前日(1-31) 5 myDate.getDay();

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

shell 中seq的用法 echo -n用法

用法:seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 增量 尾数 从1循环到100的两种方法(bash 其它的shell没试过)for x in `seq 1 100`;do echo $x;donefor x in {1..100};do echo $x;done echo -n 不换行输出 $echo -n "123" $echo "456" 最终输出 123456 echo -e 处理特殊字符 若字符串中

sudo的用法

su -l user -C 'COMMAND' 是用user这个用户执行命令 我们一般使用sudo 这个命令 sudo [-u] user COMMAND sudo [-k] COMMAND 清除此前用户的密码. sudo的配置文件/etc/sudoers 配置项为 users    hosts=(runas)    commands users:可以是一个用户的名称也可以是一个组,也可以是一个别名 username #UID user_alias 用户别名的用法 User_Alias NETA

几招学会 Python 3 中 PyMongo 的用法

本文和大家分享的是Python3下MongoDB的存储操作相关内容,在看本文之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python的PyMongo库.下面进入正题,一起来看看吧,希望对大家学习Python3有所帮助. 连接MongoDB 连接MongoDB我们需要使用PyMongo库里面的MongoClient,一般来说传入MongoDB的IP及端口即可,第一个参数为地址host,第二个参数为端口port,端口如果不传默认是27017. import pymongo cl