【XML】TinyXML 详解

news2024/12/24 20:57:40

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 = 1
			TiXmlText			"Go to the "
			TiXmlElement		"bold"
				TiXmlText		"Toy store!"
		TiXmlElement			"Item" Attributes: priority=2
			TiXmlText			"Do bills"

9、类简介

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SQL题目】连续日期的判断

【1.查询至少连续3天下单的用户】 思路1&#xff08;使用lead&#xff09;&#xff1a; distinct user_id,create_date去重&#xff0c;确保每个用户每天只有一条访问记录lead(create_date,2,‘9999-12-31’) over(partition by user_id order by create_date)根据用户分区&am…

模型实战(18)之C++ - tensorRT部署GAN模型实现人脸超分辨重建

模型实战(18)之C++ - tensorRT部署GAN模型实现人脸超分辨重建 一个实现人脸超分辨率重建的demo支持StyleGAN: GPEN or GFPGAN通过C++ - tensorrt 快速部署,推理速度每帧 在RTX3090上5.5ms+,RTX3050上10ms+下边是实现效果(图片来源于网络search,如若侵权,联系删除) 下边…

AI Native工程化:百度App AI互动技术实践

作者 | GodStart 导读 随着AI浪潮的兴起&#xff0c;越来越多的应用都在利用大模型重构业务形态&#xff0c;在设计和优化Prompt的过程中&#xff0c;我们发现整个Prompt测评和优化周期非常长&#xff0c;因此&#xff0c;我们提出了一种Prompt生成、评估与迭代的一体化解决方案…

YashanDB个人版体验总结

前言 YashanDB数据库具有多项功能特性。首先&#xff0c;它是一个分布式数据库&#xff0c;支持水平扩展&#xff0c;能够将数据分散到多个节点上&#xff0c;从而提高系统的可靠性和性能。其次&#xff0c;YashanDB数据库具备高可用性&#xff0c;支持主从复制和自动故障转移…

竞赛保研 基于Django与深度学习的股票预测系统

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于Django与深度学习的股票预测系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff…

VS ASP.Net Core项目还原Packages包到本地(解决服务器没有网无法重新生成的问题)

问题背景 ASP.Net Core MVC项目&#xff0c;无法重新生成。 现场服务器没有网,放上去的代码无法通过nuget还原包到服务器&#xff0c;导致无法编译无法运行。 解决办法 将Packages还原到本机&#xff08;有网&#xff09;&#xff0c;然后再将代码放到服务器运行。 在有网的…

KoPA: Making Large Language Models Perform Better in Knowledge Graph Completion

本来这个论文用来组会讲的&#xff0c;但是冲突了&#xff0c;没怎么讲&#xff0c;记录一下供以后学习。 创新点 按照我的理解简单概述一下这篇论文的创新点 提出使用大模型补全知识图谱&#xff0c;并且融合知识图谱的结构信息提出一个新的模型KoPA模型&#xff0c;采用少…

Excel 获取当前行的行数

ROW() 获取当前行 ROW()1 获取当前行然后支持二次开发

java基础入门-23-【网络编程】

java基础入门-23-【网络编程】 32、网络编程1.什么是网络编程2.网络编程三要素1.1 IP1.2 总结1.3 IPV4的地址分类形式1.4 常见的CMD命令1.5 InetAddress类的使用1.6 端口和协议 2.UDP通信程序2.1 UDP发送数据2.2UDP接收数据2.3UDP通信程序练习2.4UDP三种通讯方式2.5UDP组播实现…

more的详细用法

概要&#xff1a; Linux中more的功能是分页显示文件内容 空格键显示下一屏(页)&#xff0c;回车键Enter显示下一行&#xff0c;q键退出 本篇所用系统是Ubuntu22.04 一、more filename more后面跟的是文件名&#xff0c;分页显示文件内容 二、more < filename more从…

在MacOS上Qt配置OpenCV并进行测试

一.Qt环境准备 上一篇博客我讲了如何下载配置OpenCV库&#xff0c;但是在Qt5.15.2使用OpenCV库时&#xff0c;出现了一个问题就是我下载的Qt5.15.2是x86架构的&#xff0c;不能对OpenCV库进行链接&#xff0c;而OpenCV库是arm架构的 直接使用Qt5.15.2编译链接OpenCV库链接头文件…

Leetcode—75.颜色分类【中等】

2023每日刷题&#xff08;六十五&#xff09; Leetcode—75.颜色分类 实现代码 class Solution { public:void sortColors(vector<int>& nums) {int red 0, white 0, blue 0;for(auto num: nums) {if(num 0) {red;} else if(num 1) {white;} else {blue;}}for…

1. 创建型模式 - 工厂方法模式

亦称&#xff1a; 虚拟构造函数、Virtual Constructor、Factory Method 意图 工厂方法模式是一种创建型设计模式&#xff0c; 其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例化对象的类型。 问题 假设你正在开发一款物流管理应用。 最初版本只能处理卡车运输…

PnetLab[网络虚拟化实验平台]下载地址

Pnet是一款分组网络仿真工具实验室和EVE-NG类似&#xff0c;由于官方提供的下载地址对我大国内域网络并不友好&#xff0c;特地将资源搬运至此。 PNETLAB-5.1.2.ova 下载 访问码&#xff1a; h2or 5.3.11升级包 下载 访问码&#xff1a; quu9 PNET_4.2.10.ova 下载 访问码&…

【C语言】指针详解(二)

目录 1.指针变量类型的意义 1.1指针的解引用 1.2指针 - 整数 1.3void*指针 2.const修饰指针 2.1const修饰变量 2.2const修饰指针变量 1.指针变量类型的意义 1.1指针的解引用 指针变量的大小和类型无关&#xff0c;只要是指针变量&#xff0c;在同一个平台下&#xff0…

技术人的年终总结报告,请笑纳

背景 年底了&#xff0c;部门间&#xff0c;小组间不可避免的需要写年终总结报告。我相信很多朋友这件事肯定比较反感。认为这些东西都是表面形式&#xff0c;没有任何意义&#xff1b;亦或对于专心搞开发的人&#xff0c;对于这种报告并不擅长&#xff0c;不知道如何下手&…

openGuass:极简版安装

目录 一、openGauss简介 二、初始化安装环境 1.创建安装用户 2.修改文件句柄设置 ​3.修改SEM内核参数 4.关闭防火墙 6.禁用SELINUX 7.安装依赖软件 8.重启服务器 三、安装数据库 1.下载安装包 2.创建安装目录 3.解压安装包 4.执行安装 5.验证安装 四、gsql工具…

stm32DMA

DMA 文章目录 DMADMA简介DMA功能框图DMA请求DMA请求通道 **仲裁器** DMA 数据配置从哪里来到哪里去外设到存储器存储器到外设存储器到存储器 DMA初始化结构体讲解配置DMA TO P(外设)代码例子 DMA简介 DMA(Direct Memory Access)—直接存储器存取&#xff0c;是单片机的一个外设…

TCP/IP 传输层协议

传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP&#xff08;Transmission Control Protocol&#xff09;和用户数据包协议UDP&#xff08;User Datagram Protocol&#xff09;。 TCP协议 TCP是一种面向连接的传输层协议&#…

2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会成功举办

12月16日&#xff0c;2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会于北京西郊宾馆成功举办。活动吸引了来自行业内众多一流专家、学者参与&#xff0c;共同探讨和展示了他们在智能运维领域的最新研究成果和技术应用&#xff0c;为智能运维技术的学术研究、生产实…