当前位置: 首页 > news >正文

【XML】TinyXML 详解

1、简介

优点:
TinyXML 是一个简单、小型的 C++ XML 解析器,可以轻松集成到项目中。
TinyXML 解析 XML 文档,并根据该文档构建可读取、修改和保存的文档对象模型 (DOM)
TinyXML 是在 ZLib 许可下发布的,因此可以在开源或商业代码中使用它。
TinyXML 支持 UTF-8,允许以任何语言操作 XML 文件。

缺点:
TinyXML 目前不使用或直接支持 wchar、TCHAR 或 Microsoft 的 _UNICODE。
TinyXML 不解析或使用 DTD(文档类型定义)或 XSL(可扩展样式表语言)。

DTD 语法:

<!DOCTYPE 存档 [<!ELEMENT 注释 (#PCDATA)>
]>

下载地址
https://sourceforge.net/projects/tinyxml/files/latest/download

2、集成到项目中

TinyXML可以轻松集成到项目中,只需将两个头文件、四个源文件添加到项目中即可。

tinystr.h
tinyxml.h
tinystr.cpp
tinyxml.cpp
tinyxmlerror.cpp
tinyxmlparser.cpp

3、添加对STL的支持

TinyXML 可以编译为使用或不使用STL。
使用STL时,TinyXML使用std::string类,并完全支持std::istream、std::ostream、operator<<和operator>>。
许多 API 方法都有“const char*”和“const std::string&”两种形式。

在文件tinyxml.h的开头添加如下宏,即可支持STL

#define TIXML_USE_STL

4、打印显示

TinyXML支持三种打印:

Print(FILE*)	输出到文件或者标准输出(有换行符,输出漂亮)
operator<<		输出到 C++ 流与,标准 C++ iostream 集成(无换行符,不易阅读,适合网络传输)
TiXmlPrinter	输出到 std::string 或内存缓冲区

5、输入输出流

添加宏 TIXML_USE_STL 后 TinyXML 支持 C++ 流streams (operator <<,>>);
也支持 C (FILE*) 流。

1)C 风格输出
基于 FILE*,使用接口 Print() 和 SaveFile(),
生成带有大量空白的格式化输出,旨在尽可能便于人类阅读。
能够容忍格式错误的 XML 文档。例如,包含 2 个根元素和 2 个声明的 XML 文档仍将打印。

2)C 风格输入
基于 FILE*,使用接口 Parse() 和 LoadFile()
快速、宽容的阅读(容忍格式错误的XML 文档)

3)C++ 风格的输出
基于 std::ostream,使用操作符 operator<<
生成压缩输出,便于网络传输而不是为了可读性。
不能容忍格式错误的 XML:文档应该包含正确的一个根元素,额外的根级元素将不会输出。

4)C++ 风格输入
基于 std::istream,使用操作符 operator>>
从流中读取 XML,使其可用于网络传输。
TinyXML 在读取根元素后将假定 XML 数据是完整的。换句话说,具有多个根元素的结构不良的文档将无法正确读取。
另请注意,由于 STL 的实现和 TinyXML 的限制,operator>> 比 Parse() 稍慢。

5)打印示例

#include <iostream>
#include <sstream>
#include "tinyxml.h"
using namespace std;
int main()
{TiXmlDocument doc( "demotest.xml" );bool loadOkay = doc.LoadFile();# a)打印到标准输出doc.Print( stdout );# b) 使用 TiXmlPrinter 打印TiXmlPrinter printer;doc.Accept( &printer );fprintf( stdout, "%s", printer.CStr() );# c)使用c++操作符<<std::cout << doc;

6、多个空格的处理

对于是否应该保留空白或压缩空白,并没有达成一致的标准。
例如,假设“_”是一个空格,然后查看“Hello____world”。
HTML,以及至少一些 XML 解析器,会将其解释为“Hello_world”。它们压缩了空白。有些 XML 解析器不这样做,并将其保留为“Hello____world”。

TinyXML 支持前两种方法。调用TiXmlBase::SetCondenseWhiteSpace( bool )设置所需的行为。默认是压缩空白区域。

如果更改默认值,则应在调用 Parse 解析 XML 数据之前,
调用 TiXmlBase::SetCondenseWhiteSpace( bool ) ,并且在设置后不要再更改它。

7、错误检查

1)检查函数的返回值是否是: null

TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{TiXmlElement* element = root->FirstChildElement( "Element" );if ( element ){TiXmlElement* child = element->FirstChildElement( "Child" );if ( child ){TiXmlElement* child2 = child->NextSiblingElement( "Child" );if ( child2 ){// Finally do something useful.

2)使用句柄 TiXmlHandle 简化检查

TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{// do something useful

8、TinyXML如何描述XML

1)XML文档示例

<?xml version="1.0" standalone=no>
<!-- Our to do list data -->
<ToDo><Item priority="1"> Go to the <bold>Toy store!</bold></Item><Item priority="2"> Do bills</Item>
</ToDo>

2)读取XML

TiXmlDocument doc( "demo.xml" );doc.LoadFile();

3)第一行:声明
<?xml version="1.0" standalone=no>将被保存在 TiXmlComment 中

4)注释

<!-- Our to do list data -->将被保存在 TiXmlUnknown 中

5)元素
<ToDo> 保存 TiXmlElement 对象中。该元素没有任何属性,但包含其他 2 个元素

6)文本
Go to the 对应 TiXmlText.

完整的对应关系如下:

TiXmlDocument					"demo.xml"TiXmlDeclaration			"version='1.0'" "standalone=no"TiXmlComment				" Our to do list data"TiXmlElement				"ToDo"TiXmlElement			"Item" Attribtutes: priority = 1TiXmlText			"Go to the "TiXmlElement		"bold"TiXmlText		"Toy store!"TiXmlElement			"Item" Attributes: priority=2TiXmlText			"Do bills"

9、类简介

1)继承关系
在这里插入图片描述
2)说明

TiXmlAttribute		属性是名称-值对
TiXmlBase		 	TinyXml 中每个类的基类
TiXmlComment		XML 注释
TiXmlDeclaration	在正确的 XML 中,声明是文件中的第一个行
TiXmlDocument		始终是顶级节点
TiXmlElement		元素是一个容器类
TiXmlHandle			TiXmlHandle是一个用空检查包装节点指针的类;这是一个非常有用的类
TiXmlNode			文档对象模型中所有内容的父类
TiXmlPrinter		打印到内存功能
TiXmlText			XML文本
TiXmlUnknown		tinyXml 无法识别的任何标记都会保存为未知标记
TiXmlVisitor		实现“访问者模式”的接口
http://www.lryc.cn/news/265486.html

相关文章:

  • 泛社交裂变场景下AB增量科学评估方案
  • 【无标题】json报错
  • MyBatis中延迟加载,全局和局部的开启使用与关闭
  • MyBatis增删改查基础及其xml文件
  • 视觉学习(1)—— 理论
  • pip 常用指令 pip list 命令用法介绍
  • 【DP】62.不同路径
  • 大数据、知识图谱和强化学习的综合应用
  • MFC使用高速绘图控件high-speed Charting Control绘制柱形图
  • vue3 H5项目中实现PDF预览
  • 【WebRTC---源码篇】(十一:一)采集编码发送期间使用时间戳的详细解读
  • Python学习路线 - Python语言基础入门 - Python异常、模块与包
  • eventbus,在this.$on监听事件时无法在获取数据
  • 【Python必做100题】之第二十五题(统计字符)
  • 开发语言:ArkTS
  • Qt中字符串转换为JS的函数执行
  • TCP/IP:从数据包到网络的演变
  • 闪存驱动器与机械硬盘与固态硬盘
  • java String转asc码,然后ascII再转四位的16进制数。
  • 零基础制作宠物用品小程序
  • 【SpringBoot篇】解决缓存击穿问题① — 基于互斥锁方式
  • 系列一、GitHub搜索技巧
  • 35.java后端面试宝典
  • Linux 磁盘空间占满故障解决方法
  • 让生活更智能,P1600边缘智能网关带你进入智能家居新时代
  • Java与前端:2023年的真实状况与焦虑解读
  • adb 基本命令合集
  • [RK-Linux] RK3399支持M.2 NVMe SSD启动
  • LTO-3 磁带机种草终于是用上了
  • 【全网首发】洛谷P1020 [NOIP1999 提高组] 导弹拦截