C++中rapidxml用法
转载:https://www.cnblogs.com/rainbow70626/p/7586713.html
解析xml是第三方库很多,例如:tingxml,这次学习一下rapidxml,rapidxml是一个快速的xml库,比tinyxml快了50-100倍。
这个库的下载地址为:官方网站:https://sourceforge.net/projects/rapidxml/
这个库源码一共只有四个文件分别是:
测试demo:
#include <iostream>
#include "rapidxml.hpp"
#include "rapidxml_print.hpp"
#include "rapidxml_utils.hpp" using namespace rapidxml; int CreateXml()
{
rapidxml::xml_document<> doc;
rapidxml::xml_node<>* rot = doc.allocate_node(rapidxml::node_pi, doc.allocate_string("xml version='1.0' encoding='utf-8'"));
doc.append_node(rot);
rapidxml::xml_node<>* node = doc.allocate_node(rapidxml::node_element, "config", "information");
doc.append_node(node);
rapidxml::xml_node<>* color = doc.allocate_node(rapidxml::node_element, "color", NULL);
node->append_node(color);
color->append_node(doc.allocate_node(rapidxml::node_element, "red", "0.1"));
color->append_node(doc.allocate_node(rapidxml::node_element, "green", "0.1"));
color->append_node(doc.allocate_node(rapidxml::node_element, "blue", "0.1"));
color->append_node(doc.allocate_node(rapidxml::node_element, "alpha", "1.0"));
rapidxml::xml_node<>* size = doc.allocate_node(rapidxml::node_element, "size", NULL);
size->append_node(doc.allocate_node(rapidxml::node_element, "x", ""));
size->append_node(doc.allocate_node(rapidxml::node_element, "y", ""));
node->append_node(size);
rapidxml::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, );
std::cout << text << std::endl;
std::ofstream out("config2.xml");
out << doc; return ;
} //读取并修改config3.xml
int ReadAndChangeXml()
{
rapidxml::file<> fdoc("config2.xml");
std::cout << fdoc.data() << std::endl;
rapidxml::xml_document<> doc;
doc.parse<>(fdoc.data());
std::cout << doc.name() << std::endl;
//! 获取根节点
rapidxml::xml_node<>* root = doc.first_node();
std::cout << root->name() << std::endl;
//! 获取根节点第一个节点
rapidxml::xml_node<>* node1 = root->first_node();
std::cout << node1->name() << std::endl;
rapidxml::xml_node<>* node11 = node1->first_node();
std::cout << node11->name() << std::endl;
std::cout << node11->value() << std::endl;
//! 修改之后再次保存
rapidxml::xml_node<>* size = root->first_node("size");
size->append_node(doc.allocate_node(rapidxml::node_element, "w", ""));
size->append_node(doc.allocate_node(rapidxml::node_element, "h", ""));
std::string text;
rapidxml::print(std::back_inserter(text), doc, );
std::cout << text << std::endl;
std::ofstream out("../config/config2.xml");
out << doc; return ;
} void createxml()
{
xml_document<> doc;
xml_node<>* root = doc.allocate_node(node_pi, doc.allocate_string("xml version='1.0' encoding='utf-8'"));
doc.append_node(root); xml_node<>* node = doc.allocate_node(node_element, "config", "information");
doc.append_node(node); xml_node<>* color = doc.allocate_node(node_element, "color", NULL);
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", "0.1")); xml_node<>* size = doc.allocate_node(node_element, "size",NULL);
node->append_node(size);
size->append_node(doc.allocate_node(node_element, "x", ""));
size->append_node(doc.allocate_node(node_element, "y", ""));
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, );
std::cout << text << std::endl;
std::ofstream out("config.xml");
out << doc;
} void readAndChangexml()
{
file<> fdoc("config.xml"); xml_document<> doc;
std::cout << fdoc.data() << std::endl;
//doc.parse<0>(fdoc.data());//修改节点值不会保存到文件中
doc.parse<rapidxml::parse_no_data_nodes>(fdoc.data());//修改节点值会保存到文件中
std::cout << "///" << std::endl;
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<>* size = root->first_node("size"); xml_node<>* x = size->first_node("x");
x->value(""); std::cout << size->first_node("x")->value() << std::endl; std::string text;
print(std::back_inserter(text), doc, );
std::cout << text << std::endl;
std::ofstream out("config.xml");
out << doc;
} int main()
{
//createxml();
readAndChangexml();
//CreateXml();
//system("pause");
return ;
}
C++中rapidxml用法的更多相关文章
- C++中rapidxml用法及例子
rapidxml是一个快速的xml库,比tinyxml快了50-100倍.本文给出创建.读取.写入xml的源码. 由于新浪博客不支持文本文件上传,在使用下面代码需要先下载 rapidxml,关于这个库 ...
- C++中rapidxml用法及例子(源码)
rapidxml是一个快速的xml库,比tinyxml快了50-100倍.本文给出创建.读取.写入xml的源码. 由于新浪博客不支持文本文件上传,在使用下面代码需要先下载 rapidxml, ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- ORACLE 中ROWNUM用法总结(转)
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- AngularJS select中ngOptions用法详解
AngularJS select中ngOptions用法详解 一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...
- c#初学-多线程中lock用法的经典实例
本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被 ...
- .NET3.5中JSON用法以及封装JsonUtils工具类
.NET3.5中JSON用法以及封装JsonUtils工具类 我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便.简单.强大且重用性高的效果. 首先创建一个类 ...
- ORACLE 中ROWNUM用法总结!
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- Android开发中Bundle用法包裹数据(转)
Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...
随机推荐
- Linux(Ubuntu)系统下使用crontab定期执行任务
安装cron(Ubuntu系统自带) apt-get install cron 开启crontab日志 默认情况下的日志是没有开启的,我们需要找到 /etc/rsyslog.d/50-default. ...
- Lnmp环境安装禅道项目管理软件
1.本地环境 CentOS Linux release 7.5.1804 (Core) PHP 7.1.0-dev (cli) mysql Ver 14.14 Distrib 5.7.22 nginx ...
- Linux service进程管理
Linux进程基本介绍: 1)在Linux中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个ID号. 2)每一个进程,都对应一个父进程,而这个父进程可以复制多个子进程.例如www服务器. ...
- 一键配置树莓派wifi、静态ip等
系统老是被我玩坏,重新烧录系统后配置又太麻烦,用shell脚本一键配置一下wifi和静态IP #!/bin/bash touch /media/fanghaoyu/boot/ssh echo &quo ...
- Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇
Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Internet与中国 Internet最早来源于美 ...
- dfs 排列组合——找所有子集(重复元素和不重复元素)
17. 子集 中文 English 给定一个含不同整数的集合,返回其所有的子集. 样例 样例 1: 输入:[0] 输出: [ [], [0] ] 样例 2: 输入:[1,2,3] 输出: [ [3], ...
- Redis的入门
什么是NOSQL? NOSQL(Not Only SQL)不仅仅是数据库,是一种全新的理念,泛指非关系型的数据库. 为什么需要NOSQL? 随着互联网的高速崛起,网站的用户群的增加,访问量的上升,传统 ...
- JUnit 4.x 知识点
注解 @Test: 测试方法,在这里还可以测试期望异常和超时时间. @Before: 每个测试方法执行之前执行的方法. @BeforeClass: 一个测试类中所有测试方法执行之前执行的方法,只执行一 ...
- 20-2 树莓派搭建服务器 Tornado Web服务器
Drive.google.com/drive/folders/1ahbeoEHkjxoo4NV1wReOmpoRWbl448z- 1.Tornado简介 Tornado一款使用 Python 编写的, ...
- three arrays HDU - 6625 (字典树)
three arrays \[ Time Limit: 2500 ms \quad Memory Limit: 262144 kB \] 题意 给出 \(a\),\(b\) 数组,定义数组 \(c[i ...