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服务 ...
随机推荐
- 51nod 1257 背包问题 V3(这不是背包问题是二分)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257 题解:不能按照单位价值贪心,不然连样例都过不了 要求的 ...
- 一键升级所有pip过期库
import pipfrom subprocess import callfrom pip._internal.utils.misc import get_installed_distribution ...
- 将dos格式文件转换为unix格式
在windows下换行符是\r\n,表示回到行首并换到下一行 而unix系统中换行符是\n 这样就存在一个问题,在windows上的文档到了unix上可能就无法使用了 针对这个情况有几种解决办法: 1 ...
- mybatis动态拼接条件的技巧 where 1=1 或者where标签
/** * 根据输入的学生信息进行条件检索 * 1. 当只输入用户名时, 使用用户名进行模糊检索: * 2. 当只输入邮箱时, 使用性别进行完全匹配 * 3. 当用户名 ...
- response向客户端写入数据
1.写入文字: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Servle ...
- 微信小程序商城构建全栈应用 Thinkphp5
课程——微信小程序商城构建全栈应用[目录]第1章 前言:不同的时代,不同的Web第2章 环境,工具与准备工作第3章 模块,路由与获取请求参数第4章 构建验证层第5章 REST与RESTFul第6章 A ...
- ES6新增常见特性
一:声明属性let const var let const 区别 1.var声明变量会发生变量提升,let.const不会发生变量提升 2.var允许重复声明变量,let不可以 3.const声明变量 ...
- Spring入门(十三):Spring MVC常用注解讲解
在使用Spring MVC开发Web应用程序时,控制器Controller的开发非常重要,虽然说视图(JSP或者是Thymeleaf)也很重要,因为它才是直接呈现给用户的,不过由于现在前端越来越重要, ...
- Mac配置环境变量path
查看当前配置的path有哪些: 1. echo $PATH 当前所有的 2. cat /etc/paths 这个文件是操作系统自带的 mac系统环境变量的加载顺序(优先级): /etc/profi ...
- 前端基础-BOM和DOM学习
JavaScript分为 ECMAScript,BOM,DOM. BOM:是指浏览器对象模型,使JavaScript有能力与浏览器进行对象. DOM:是指文档对象模型,通过它,可以访问HTML文档的所 ...