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使用方法的更多相关文章
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- rapidxml读取包含中文路径的xml解析错误的解决方法
from http://blog.csdn.net/qinwei4072880/article/details/38865179 1.rapidxml不支持中文路径. 2.rapidxml不支持Uni ...
- RAPIDXML 中文手册,根据官方文档完整翻译!
简介:这个号称是最快的DOM模型XML分析器,在使用它之前我都是用TinyXML的,因为它小巧和容易上手,但真正在项目中使用时才发现如果分析一个比较大的XML时TinyXML还是表现一般,所以我们决定 ...
- rapidxml使用
以前都是用tinyxml,这次开发中解析xml配置文件像尝试一下rapidxml,据说效率很高... RapidXml Manual: http://rapidxml.sourceforge.net/ ...
- RapidXml用法
一.写xml 文件 #include <iostream> #include "rapidxml/rapidxml.hpp" #include "rapidx ...
- [xml解析]rapidxml读取文件
因为项目需要读取xml配置文件,在原来调查一番后,项目组使用了tinyxml. tinyxml确实简单,非常清楚的就把读取方案写出来了.但是,由于后期xml文件越来越大(2.5M,大概1w多行数据), ...
- 利用c++操作XML,主要是内部循环方法的使用
本文主要分享的是循环方法的使用,设置XML节点属性,用了3种循环方法. XML文件: <?xml version='1.0' encoding='utf-8' ?><root> ...
- rapidxml 序列化
void TestRapidXml() { ]; sprintf(xmlContent,"<root><head>aaa</head><body&g ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
随机推荐
- c basic library framework - simplec 2.0.0
前言 - simplec 单元测试 流程介绍 一个关于C基础库 simplec 2.0.0 发布了. 详细的文档介绍请参照 README.md. 说的再多都无用, 抵不上 gdb 一个 b r n. ...
- java.util.ConcurrentModification并发修改异常
在运行下面这段代码时出现了并发修改异常java.util.ConcurrentModification: public static void main(String[] args) { List l ...
- Django基础之form组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Internet Explorer 浏览器在同一时刻只能从同一域名下载两个文件。
Internet Explorer 浏览器在同一时刻只能从同一域名下载两个文件.至于原因请见 MSDN Blogs:<Internet Explorer and Connection Limit ...
- Java学习笔记(一)——关于java中的String类
[前面的话] 毕业将近6个月了,试用期也快要过去了,期待接下来的日子.在金融类性质的机构,最痛苦的是也许就是大部分系统外包,所以比较少写代码,在这六个月中只写了1个月左右的代码,然后每天都在做一些比较 ...
- 【JBPM4】流程分支fork - join
流程分支.聚合.流程每个分支节点都全部处理完成后,聚合到下一个节点. JPDL <?xml version="1.0" encoding="UTF-8"? ...
- javascript大神修炼记(3)——条件分支
读者朋友们好,我们今天接着前面的讲,前面已经大概了讲了一下运算符,今天的任务主要就是讲解逻辑条件分支,循环. 我们先就来模拟一个逻辑块,就用我们经常接触到的买车票来说吧,车票的价格对不同的人价格是有差 ...
- Codeforces Round #496 (Div. 3) E2 - Median on Segments (General Case Edition)
E2 - Median on Segments (General Case Edition) 题目大意:给你一个数组,求以m为中位数的区间个数. 思路:很巧秒的转换,我们把<= m 数记为1, ...
- 多线程下,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 ...
- ORACLE数据库创建动态表
最近公司一个项目代码里的定时任务无法执行,查验代码良久,奈何代码过于老旧,开发人员换了一茬又一茬,现在都无法理清,故无奈只好到数据库里重新写存过,配置定时任务. 在写存过时,由于检测及安全性能要求,需 ...