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托管内存)来做缓存,这样对于单个应用服务 ...
随机推荐
- Script - 检查当前的undo配置和建议设置 (Doc ID 1579035.1)
Script - Check Current Undo Configuration and Advise Recommended Setup (Doc ID 1579035.1) APPLIES TO ...
- java8-14-时间API
原来的时间类 1.默认值 我们使用起来不方便 2.在不同包 不规范 在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义 3.可变 线程 ...
- axios使用get方法给后端传值,登录功能的实现
前端使用vue实现页面,使用axios进行前后端交互 后端使用node.js提供接口 数据库使用navicat for mysql 前端代码:(组件中使用axios前后端交互) import axio ...
- R-3 t分布--t置信区间--t检验
本节内容: 1:t分布存在的意义是什么 2:t分布的置信区间 3:t分布检验 一.t分布存在的意义是什么 数据分析中有一块很大的版图是属于均值对比的,应用广泛. 例如:对比试验前后病人的症状,证明某种 ...
- 基于Django的Rest Framework框架的分页组件
本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...
- JavaScript:ES6的新特性
1.关键字 const:修饰常量.ES6之前只有变量的声明字段var,ES6开始引入常量关键字,被修饰的变量无法被修改. <script type="text/javascript&q ...
- PHP读取文件和目录
1:目录列表 2:文件列表
- 使用Xmanager分析Java内存情况
今天是想看下程序在正式环境中,内存使用回收的情况,于是开始. 1.首先下载Xmanager,Xshell,然后在Xshell-设置-隧道中设置转发X11连接到Xmanager: 2.开始布置Linux ...
- JMS消息传递类型特点介绍
对于消息的传递有两种类型: 一种是点对点的,即一个生产者和一个消费者一一对应: 另一种是发布/ 订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进 行接收. 特点介绍: 点到点模型点对点传 ...
- MySQL UNION 查询
UNION 用来合并多个 SELECT 结果. 考察如下两个表: # t1 +----+---------+ | id | pattern | +----+---------+ | 1 | Divot ...