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服务 ...
随机推荐
- Gym 100851 题解
A: Adjustment Office 题意:在一个n*n的矩阵,每个格子的的价值为 (x+y), 现在有操作取一行的值,或者一列的值之后输出这个和, 并且把这些格子上的值归0. 题解:模拟, 分成 ...
- 【Offer】[41] 【数据流中的中位数】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值, ...
- jQuery的大小拖动
原来一直没有拖动放大的效果,居然只是没有jquery-ui.css的样式文件,虽然这是一个很小的部分,但是防微杜渐.程序本来就是个不容有小错误的存在. 如果没有样式文件,那么可以收缩的三角形就不会出现 ...
- git 中文乱码-一次被坑经历
git log和gitcommit中文出现乱码,花了大半天的时间试了网上的各种方法,还是搞不定. 只好放大招. 卸载软件后重装,还是不行.然后git config --list 发现一些奇怪的配置信息 ...
- Vert.x 之 HelloWorld
Hello World 欢迎来到Vert.x的世界,相信您在接触Vert.x的同时,迫不及待想动手试一试,如您在学习计算机其它知识一样,总是从Hello World开始,下面我们将引导您制作一个最基本 ...
- Winform中使用FastReport实现自定义PDF打印预览
场景 Winform中使用FastReport实现简单的自定义PDF导出: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1009 ...
- STL 补档
STL 补档 1.vector 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector在C++标准模板库中的部分内容,它是 ...
- 【学习笔记】第六章 python核心技术与实践--深入浅出字符串
[第五章]思考题答案,仅供参考: 思考题1:第一种方法更快,原因就是{}不需要去调用相关的函数: 思考题2:用列表作为key在这里是不被允许的,因为列表是一个动态变化的数据结构,字典当中的key要求是 ...
- Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务
短网址顾名思义就是使用比较短的网址代替很长的网址.维基百科上面的解释是这样的: 短网址又称网址缩短.缩短网址.URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代 ...
- 在Win10右键菜单添加校验文件Hash值命令
把以下代码保存为reg文件导入注册表即可. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\文件哈希校验] " ...