pugixml的简单使用
一、简介
pugixml的官方主页为:http://pugixml.org/
pugixml是一个很棒的XML操作库,
- 它很轻量,只有三个文件(pugiconfig.hpp pugixml.cpp pugixml.hpp )
- 支持Unicode
- 支持XPATH解析
- 速度快,仅比RapidXml慢一些
- 跨平台(windows/linux)
- 面向对象
Xml库解析性能比较表
(表格来自:http://rapidxml.sourceforge.net/manual.html)
2016.12.22更新:
pugixml官网上有了新的性能对比图:
http://pugixml.org/benchmark.html
目前速度上已经比rapid_xml更快。(但我没亲自测试过)
二、配置
pugixml的三个文件,可以只include头文件pugixml.hpp,CPP文件不用放到项目中,
方法是,在pugiconfig.hpp中:
// Uncomment this to switch to header-only version
#define PUGIXML_HEADER_ONLY
#include "pugixml.cpp"
将这两行的注释去掉就可以了。
另外,如果项目使用的是Unicode设置,则可以在pugiconfig.hpp中:
// Uncomment this to enable wchar_t mode
#define PUGIXML_WCHAR_MODE
将wchar模式打开即可。
三、使用
XML文件:
<?xml version="1.0" encoding="GBK"?>
<root>
<ip>192.168.1.1</ip>
<root>
C++:
void SaveToConfig( const wchar_t* xml_file, const wchar_t* ip )
{
using namespace pugi; xml_document doc;
xml_parse_result result = doc.load_file( xml_file );
if (result.status != status_ok)
return; if (!doc.child( L"root" ))
doc.append_child( L"root" ); xml_node node = doc.child( L"root" ).child( L"ip" );
if (!node)
doc.child( L"root" ).append_child( L"ip" ) node.text().set( ip ); doc.save_file( xml_file );
}
这里需要注意的是,ip节点的内容是一个pcdata类型的节点,这个节点的内容才是ip字符串,所以这里用text()来读写IP节点内容。
如果要用.value()方法得到ip字符串的话,需要这样用:
wstring ip = node.first_child().value();
node.first_child().set_value(L"10.10.10.10");
另外,node.text().set()方法也不错,提供了常用的数据类型写入XML的重载方法:
// Set text (returns false if object is empty or there is not enough memory)
bool set(const char_t* rhs); // Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
bool set(int rhs);
bool set(unsigned int rhs);
bool set(double rhs);
bool set(bool rhs); #ifdef PUGIXML_HAS_LONG_LONG
bool set(long long rhs);
bool set(unsigned long long rhs);
#endif
而node.text().as_xxx()方法可以按需要直接从XML文件中读取出指定类型的数据:
// Get text, or "" if object is empty
const char_t* get() const; // Get text, or the default value if object is empty
const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const; // Get text as a number, or the default value if conversion did not succeed or object is empty
int as_int(int def = ) const;
unsigned int as_uint(unsigned int def = ) const;
double as_double(double def = ) const;
float as_float(float def = ) const; #ifdef PUGIXML_HAS_LONG_LONG
long long as_llong(long long def = ) const;
unsigned long long as_ullong(unsigned long long def = ) const;
#endif
实际上node.text()返回的是xml_text对象实例,上面的set()和as_xxx()是由xml_text实现的。
如果IP节点有属性的话,可以遍历属性:
for (pugi::xml_attribute attr = node.first_attribute(); attr; attr = attr.next_attribute())
{
std::cout << " " << attr.name() << "=" << attr.value();
}
C++11:
for (pugi::xml_attribute attr : node.attributes())
{
std::cout << " " << attr.name() << "=" << attr.value();
}
作为读取配置文件用,上面这些也差不多了,其它接口看看源码就能明白怎样用,pugixml提供了些高级用法,可以看他官网上提供的例子。
四、注意事项
除了上面提到的<ip>节点内容为pcdata节点外,
关于中文的问题,clever101曾在pugixml库的一个使用心得中提到,要用
std::locale::global(std::locale("chs"));
const std::wstring strFilePath = _T(“c:\\ xgconsole.xml”);
std::wifstream stream(strFilePath.c_str());
pugi::xml_document doc;
doc.load(stream);
这种load stream的方式读取,其实不必如此,只要保证文件保存时编码为GB2312并且XML文件头的声明encoding="gb2312“就可以了。
<?xml version="1.0" encoding="gb2312"?>
pugixml的简单使用的更多相关文章
- pugixml简单实用
实现快递查询,调用快递100的API,未完成. #include <iostream> #include <fstream> #include <string> # ...
- Pugixml一种快速解析XML文件的开源解析库
Pugixml是一个轻量级的C++ XML开源解析库,DOM形式的解析器.接口和丰富的遍历和修改操作,快速的解析,此外支持XPath1.0实现数据查询,支持unicode编码: 使用Pugixml可通 ...
- pugixml使用教程
pugixml介绍 pugixml是一个高性能.轻量级并且简单易用的xml解析库,支持UTF8 encoding.Little-endian UTF16.Big-endian UTF16.UTF16 ...
- [转]pugixml使用教程
转自:https://www.cnblogs.com/ltm5180/p/3989125.html pugixml介绍 pugixml是一个高性能.轻量级并且简单易用的xml解析库,支持UTF8 en ...
- pugixml应用随笔
1. 修改元素值 second_node.set_value("miller");不对 必须second_node.first_child().set_value(" ...
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- Fabio 安装和简单使用
Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
随机推荐
- myeclipse 9.0 破解方法,亲测可用
MyEclipse 9.0的破解方法,步骤如下: 1.破解公钥,确保MyEclipse没有开启,否则失败! 用WinRAR打开Common\plugins\com.genuitec.eclipse.c ...
- Invoke 与 BeginInvoke的区别
引用文章路径:https://www.cnblogs.com/lsgsanxiao/p/5523282.html invoke和begininvoke 区别 一直对invoke和begininvoke ...
- RabbitMQ学习笔记(四、RabbitMQ队列)
目录: 消息路由失败了会怎样 备份交换器 TTL与DLX 如何实现延迟队列 RabbitMQ的RPC实现 持久化 事务 发送方确认机制 消息路由失败了会怎样: 在RabbitMQ中,如果消息路由失败了 ...
- 微信小程序支付功能讲解(2)
小程序支付 业务流程时序图 官方文档 步骤: 1. Openid 在小程序初次加载的时候就已经获取(详情见 小程序登录) 2. 生成商户订单 1.商品信息由小程序端提供 2.提供支付统一下单接口所需参 ...
- acwing 517. 信息传递
地址 https://www.acwing.com/problem/content/description/519/ 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏. 在游戏里每人都有一 ...
- 小程序-小菊花loading
界面----交互 wx.showLoading() 显示loading提示框.需主动调用wx.hideLoading()才能关闭提示框 参数: 属性 类型 默认值 必填 说明 title string ...
- 【raid级别】RAID级别工作模式
友情链接 磁盘分区,格式化,挂载,创建交换分区:https://www.cnblogs.com/HeiDi-BoKe/p/11936998.html RAID工作级别:https://www.cnbl ...
- elasticsearch 索引的使用(配合haystack)
1,# 从仓库拉取镜像$ sudo docker image pull delron/elasticsearch-ik:2.4.6-1.02,下载elasticsearc-2.4.6目录拷贝到home ...
- Redis+Keepalived
简介 Redis高可用方案,保障两台Redis任意节点故障可正常使用. 方案:Redis主从复制+Redis哨兵+Keepalived 环境 系统:Centos/Radhat 7 服务1:Redis ...
- 使用Java操作Elasticsearch(Elasticsearch的java api使用)
1.Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询,格式是json. 索引index,相当于数据库中的 ...