一、写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用法相关推荐

  1. rapidxml标识符 memory

    这次转战到rapidxml中,用了几次感觉很容易上手,就测试了几次直接用在了我的项目中,但出现个莫名奇妙的错误,就是标题,找了一会,突然间想到,我在一个头文件里覆盖了new #pragma once ...

  2. Tinyxml简单使用法

    1.概要介绍一下: 尝试了tinyxml,rapidxml,libxml2等3中第3方库,前两者相对较为轻量级,libxml2非常完善,强大. 这是网上总结出来的优缺点: 1.tinyxml当节点内容 ...

  3. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  4. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  5. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  6. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  7. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  8. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

  9. OpenMP用法大全

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  10. Dorado用法与示例

    Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...

最新文章

  1. 学习需要总结。。。。
  2. java中多线程编程案例_Java中多线程编程实战的实现线程_Java编程_Java程序员_课课家...
  3. Class类---反射学习笔记(一)
  4. CVPR 2021 | 跨模态点云补全新框架ViPC:用单一视图推断完整信息
  5. 怀念一下过去的人和事
  6. 一招解决IDEA启动慢的困扰
  7. 微信自定义菜单java_使用Java语言开发微信公众平台(八)——自定义菜单功能
  8. 3.openldap生成LDAP用户
  9. linux远程升级运行程序,在LINUX上对DSP程序远程升级的实现想法
  10. linux安装桌面键盘,如何在 Linux 中使用屏幕键盘
  11. 恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(一)
  12. Compose的手势(六)
  13. 逻辑回归算法原理及用于解决多分类问题
  14. 从毕业生到高级工程师:三位腾讯高级程序员的感悟
  15. mysql临时表删除_MySQL如何创建和删除临时表
  16. Docker——网络
  17. 冗余技术----线路冗余与生成树技术及其安全增强
  18. java switch语句怎么写,java怎么用switch语句
  19. 究竟是什么人在买爱马仕?
  20. 游资会带散户炒股吗?

热门文章

  1. PE安装win10系统
  2. Python 爬虫 书籍爬取实例
  3. 20210116 plecs 版本更新笔记
  4. MIKE水动力笔记10_潮汐调和分析与绘制同潮时线图
  5. fragstats移动窗口
  6. LBP特征原理及代码实现
  7. 编程开发软件工具下载
  8. 天勤数据结构代码——递归
  9. 基于matlab仿真的功率因数测定方法研究,基于MATLAB的单相全控整流电路功率因数测定.pdf...
  10. 操作系统课后答案第三章