TinyXML2的快速实践
最近遇到个需要在C++中处理XML文件的需求,虽然对此方面并不是很熟,但好在有GitHub上的awesome-cpp项目的帮助,还是收获了足够的相关知识。
类库
常用的或被推荐的XML类库有以下数个选项,不过相较于纯C完成的类库个人还是更倾向于C++的类库:
- Boost.PropertyTree - A property tree parser/generator that can be used to parse XML/JSON/INI/Info files. [Boost]
 - Expat - An XML parser library written in C. [MIT]
 - Libxml2 - The XML C parser and toolkit of Gnome. [MIT]
 - libxml++ - An XML Parser for C++. [LGPL2]
 - Mini-XML - A small XML parsing library written in ANSI C. [LGPL2 with exceptions]
 - PugiXML - A light-weight, simple and fast XML parser for C++ with XPath support. [MIT]
 - RapidXml - An attempt to create the fastest XML parser possible, while retaining useability, portability and reasonable W3C compatibility. [Boost]
 - TinyXML - A simple, small, minimal, C++ XML parser that can be easily integrating into other programs. [zlib]
 - TinyXML2 - A simple, small, efficient, C++ XML parser that can be easily integrating into other programs. [zlib]
 - TinyXML++ - A completely new interface to TinyXML that uses MANY of the C++ strengths. Templates, exceptions, and much better error handling. [MIT]
 - Xerces-C++ - A validating XML parser written in a portable subset of C++. [Apache2]
 
TinyXML VS TinyXML2
TinyXML是在寻找更多信息时被多次提及的,因为并不想花费过多时间在做选择题上,于是其似乎成了最终的赢家。
但未曾想它自身还有两个版本。
TinyXML与TinyXML2的相同点:
- 简单的API
 - 基于DOM的解析器
 - 支持UTF-8 Unicode
 
TinyXML2的优点:
- 着眼于未来的开发
 - 更少的内存分配(1/10到1/100),使用更少的内存(TinyXML的40%),更快(读取上约5倍)
 - 不再需要STL
 - 更现代的C++,包括一个合适的命名空间
 - 适当且有用地处理空白
 
TinyXML的优点:
- 能够报告解析错误的位置
 - 支持一些C++ STL约定:流与字符串
 - 非常成熟并且调试良好的代码库
 
TinyXML2的第2及第4项优点是我更中意的,所以还是选它吧。
使用方法
在其GitHub的仓库中下载相关文件,tinyxml2

找到tinyxml2.h与tinyxml2.cpp两个文件,将它们添加至你的工程项目中,这便是所有需要的。
示例
#include <iostream>
#include <random>
#include "tinyxml2.h"
using namespace tinyxml2;
void writeXMLFile()
{
	XMLDocument doc;
	auto delaration = doc.NewDeclaration();
	doc.InsertFirstChild(delaration);
	auto root = doc.NewElement("root");
	doc.InsertEndChild(root);
	auto id = doc.NewElement("id");
	id->SetText(666);
	root->InsertEndChild(id);
	auto name = doc.NewElement("name");
	name->SetText("Ken");
	name->SetAttribute("blogger", true);
	root->InsertEndChild(name);
	doc.SaveFile("sample.xml");
}
XMLDocument* readXMLFile()
{
	auto doc = new XMLDocument;
	doc->LoadFile("sample.xml");
	auto root = doc->RootElement();
	auto id = root->FirstChildElement("id");
	std::cout << id->GetText() << std::endl;
	auto name = root->FirstChildElement("name");
	std::cout << name->GetText() << std::endl;
	std::cout << name->Attribute("blogger") << std::endl;
	return doc;
}
int main()
{
	writeXMLFile();
	auto doc = readXMLFile();
	auto root = doc->RootElement();
	auto id = root->FirstChildElement("id");
	doc->DeleteNode(id);
	auto randomid = doc->NewElement("randomid");
	std::default_random_engine e;
	std::uniform_int_distribution<int> u;
	auto r = u(e, decltype(u)::param_type(1000000, 9000000));
	randomid->SetText(r);
	root->InsertFirstChild(randomid);
	doc->Print();
	delete doc;
}
												
											TinyXML2的快速实践的更多相关文章
- ES6核心内容精讲--快速实践ES6(一)
		
前言 本文大量参考了阮一峰老师的开源教程ECMAScript6入门,适合新手入门或者对ES6常用知识点进行全面回顾,目标是以较少的篇幅涵盖ES6及部分ES7在实践中的绝大多数使用场景.更全面.更深入的 ...
 - ES6核心内容精讲--快速实践ES6(二)
		
Iterator和for...of 是什么: Iterator(遍历器)是专门用来控制如何遍历的对象,具有特殊的接口. 怎么用: Iterator(遍历器)对象带有next方法,每一次调用next方法 ...
 - Python异步asyncio快速实践模版
		
只是参考快速跑起来模版,细节或者封装流畅使用需要详细阅读aiohttp文档 1 import asyncio 2 3 async def foo(): 4 await print('bar') 5 6 ...
 - ES6核心内容精讲--快速实践ES6(三)
		
Promise 是什么 Promise是异步编程的一种解决方案.Promise对象表示了异步操作的最终状态(完成或失败)和返回的结果. 其实我们在jQuery的ajax中已经见识了部分Promise的 ...
 - .net core系列之《新一代的配置系统Configuration在支持多数据源,热更新,层级化方面代码快速实践》
		
在我们之前.Net Framework的项目中,配置文件是WebConfig或AppcConfig文件,而当我们想要添加我们自定义的节点时,还需要在这个文件中的section中定义我们自定义的节点,这 ...
 - 神工鬼斧惟肖惟妙,M1 mac系统深度学习框架Pytorch的二次元动漫动画风格迁移滤镜AnimeGANv2+Ffmpeg(图片+视频)快速实践
		
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_201 前段时间,业界鼎鼎有名的动漫风格转化滤镜库AnimeGAN发布了最新的v2版本,一时间街谈巷议,风头无两.提起二次元,目前国 ...
 - Spring zuul 快速入门实践 --看zuul如何进行服务转发
		
zuul 作为springCloud 的全家桶组件之一,有着不可或缺的分量.它作为一个普通java API网关,自有网关的好处: 避免将内部信息暴露给外部: 统一服务端应用入口: 为微服务添加额外的安 ...
 - 3D GIS 应用开发 —— 基于 Mapbox GL 的实践总结
		
最近在折腾的 web 端的可视化项目,由于相关业务的需要,用到了 Mapbox 这一地图开发的神器.在此先奉上一个基于mapbox-gl实现的demo(来源:uber的deck.gl项目): 下面我们 ...
 - Nuget快捷实践
		
Nuget快捷实践 简介 本文主要包含三个部分,即创建nuget包.上传nuget包和删除nuget包.旨在引导快速使用nuget打包和使用,并实现对于nuget的简单管理. 本文使用的nuget服务 ...
 
随机推荐
- dp递推 hdu1978
			
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
 - java中父类子类静态代码块、构造代码块执行顺序
			
父类静态(代码块,变量赋值二者按顺序执行) 子类静态 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法 普通方法在实列调用的时候执行,肯定位于上面之后了 //父类A public class ...
 - 【LeetCode】103# 二叉树的锯齿形层次遍历
			
题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], ...
 - idea中applicationContext-dao.xml文件中Cannot resolve file***** :spring xml model validation问题
			
访问不了classpath下的文件夹中的文件 解决办法如下:(问题出在我创建的resources文件夹是一个普通的文件夹) 1.本来是普通的文件夹 2.ctrl+shift+alt+s打开如下界面: ...
 - System类入门学习
			
System类 System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包.其包含一些有用的字段和方法,不能被实例化 system中包含了in.out和err三 ...
 - WTM送书活动:向更遥远的星辰大海起航~
			
是的,没错~ 这一篇不是大老刘写的.哈哈~ 啥? 你想知道为啥? 大老刘为了你们不加班,熬夜改BUG,姑娘不乐意了... 然后... 后面请自行脑补~ 哎~生活还要继续鸭.... 那么,接下来由我陪 ...
 - Python文件访问编码格式问题UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position xx: 解决方案
			
1.Python读取文件 # .打开文件 file = open("ReadMe") # .读取文件类容 text = file.read() print(text) # .关闭文 ...
 - 利用github搭建私人maven仓库
			
一.背景 最近在做HBase的项目,不免会引用到一些工具类,如StringUtils,NumberUtils,DateUtils这些,公司底层有封装好可以直接使用. 但是项目完成,用maven打包部署 ...
 - Python 开发植物大战僵尸游戏
			
作者:楷楷 链接:https://segmentfault.com/a/1190000019418065 开发思路 完整项目地址: https://github.com/371854496/pygam ...
 - caffe学习一:ubuntu16.04下跑Faster R-CNN demo (基于caffe). (亲测有效,记录经历两天的吐血经历)
			
兜兜转转,兜兜转转; 一次有一次,这次终于把Faster R-CNN 跑通了. 重要提示1:在开始跑Faster R-CNN之前一定要搞清楚用的是Python2 还是Python3. 不然你会无限次陷 ...