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()) {//TO DO }
六、遍历全部属性
for(rapidxml::xml_attribute<char> * attr = node->first_attribute("node name");attr != NULL;attr = attr->next_attribute()) {char * value = attr->value(); }
转载于:https://www.cnblogs.com/rainbow70626/p/10386131.html
RapidXml用法相关推荐
- rapidxml标识符 memory
这次转战到rapidxml中,用了几次感觉很容易上手,就测试了几次直接用在了我的项目中,但出现个莫名奇妙的错误,就是标题,找了一会,突然间想到,我在一个头文件里覆盖了new #pragma once ...
- Tinyxml简单使用法
1.概要介绍一下: 尝试了tinyxml,rapidxml,libxml2等3中第3方库,前两者相对较为轻量级,libxml2非常完善,强大. 这是网上总结出来的优缺点: 1.tinyxml当节点内容 ...
- c语言中external,static关键字用法
static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...
- Pandas_transform的用法
先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...
- Python中yield和yield from的用法
yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...
- pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法
squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...
- python yield 和 yield from用法总结
#例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...
- tf.nn.embedding_lookup()的用法
函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...
- OpenMP用法大全
OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...
- Dorado用法与示例
Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...
最新文章
- 学习需要总结。。。。
- java中多线程编程案例_Java中多线程编程实战的实现线程_Java编程_Java程序员_课课家...
- Class类---反射学习笔记(一)
- CVPR 2021 | 跨模态点云补全新框架ViPC:用单一视图推断完整信息
- 怀念一下过去的人和事
- 一招解决IDEA启动慢的困扰
- 微信自定义菜单java_使用Java语言开发微信公众平台(八)——自定义菜单功能
- 3.openldap生成LDAP用户
- linux远程升级运行程序,在LINUX上对DSP程序远程升级的实现想法
- linux安装桌面键盘,如何在 Linux 中使用屏幕键盘
- 恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(一)
- Compose的手势(六)
- 逻辑回归算法原理及用于解决多分类问题
- 从毕业生到高级工程师:三位腾讯高级程序员的感悟
- mysql临时表删除_MySQL如何创建和删除临时表
- Docker——网络
- 冗余技术----线路冗余与生成树技术及其安全增强
- java switch语句怎么写,java怎么用switch语句
- 究竟是什么人在买爱马仕?
- 游资会带散户炒股吗?