【XML】TinyXML 详解(一):介绍

news2024/10/1 5:41:46

【C++】郭老二博文之:C++目录

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 中,声明是文件中的第一个行
TiXmlDocument		始终是顶级节点
TiXmlElement		元素是一个容器类
TiXmlHandle			TiXmlHandle是一个用空检查包装节点指针的类;这是一个非常有用的类
TiXmlNode			文档对象模型中所有内容的父类
TiXmlPrinter		打印到内存功能
TiXmlText			XML文本
TiXmlUnknown		tinyXml 无法识别的任何标记都会保存为未知标记
TiXmlVisitor		实现“访问者模式”的接口

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

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

相关文章

UG凸起命令

凸起命令是拉伸命令的补充&#xff0c;可以方便的对曲面进行拉伸切除。 当端盖中几何体类型选择默认的截面平面的时候&#xff0c;相当于拉伸命令 当端盖中几何体类型选择凸起的面的时候&#xff0c;相当于拉伸其实曲线变为选择曲线在凸起面的投影曲线&#xff0c;然后基于凸起…

栈的常见题型

1.有效的括号 char pairs(char a) {if(a})return {;if(a])return [;if(a))return (;return 0; } bool isValid(char* s) {char* stack(char*)malloc(sizeof(char)*10000);int top0;int lenstrlen(s);if(len%21)return false;for(int i0;s[i];i){char chpairs(s[i]);if(ch){if(t…

BTF:实践指南

本文地址&#xff1a;BTF&#xff1a;实践指南 | 深入浅出 eBPF 1. BPF 的常见限制 1.1 调试限制1.2 可移植性2. BTF 是什么&#xff1f;3. BTF 快速入门 3.1 BPF 快速入门3.1 BTF 和 CO-RE4. 结论 BPF 是 Linux 内核中基于寄存器的虚拟机&#xff0c;可安全、高效和事件驱动…

【STM32】STM32学习笔记-TIM定时中断(13)

00. 目录 文章目录 00. 目录01. TIM简介02. 定时器类型03. 基本定时器04. 通用定时器05. 高级定时器06. 定时中断基本结构07. 预分频器时序08. 计数器时序09. 计数器无预装时序10. 计数器有预装时序11. RCC时钟树12. 附录 01. TIM简介 TIM&#xff08;Timer&#xff09;定时器…

数据库中间件介绍

文章目录 什么是数据库中间件&#xff1f;Smart-client 模式优点缺点 Proxy 模式优点缺点 单元化架构优点缺点 总结 数据库中间件是连接数据库和应用程序之间的软件层&#xff0c;用于简化数据库管理、提高性能和可伸缩性&#xff0c;同时提供额外的功能和服务。在分布式系统和…

mybatis的二级缓存使用以及禁用

目录 mybatis 二级缓存配置有两处 全局设置 mapper 设置 测试代码 执行结果 源码执行逻辑 创建 SqlSession 二级缓存配置是否添加 解析 cache 标签 XMLMapperBuilder MapperBuilderAssistant CacheBuilder PerpetualCache SerializedCache LoggingCache 将 cach…

Python教程(17)——python模块是什么?python模块详解

Python模块简介 模块是一个包含了Python定义和语句的文件&#xff0c;可用于将功能组织成可重用和可维护的代码块。每个Python文件都可以作为一个模块&#xff0c;模块可以包含变量、函数、类或可执行代码。通过使用模块&#xff0c;我们可以将代码分离成逻辑单元&#xff0c;…

【vtkWidgetRepresentation】第十八期 vtkHoverWidget

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkHoverWidget,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. vtkHoverWidget vtkHoverWidget用于在呈现窗口中…

Python生成圣诞节贺卡-代码案例剖析【第18篇—python圣诞节系列】

文章目录 ❄️Python制作圣诞节贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析 ❄️Python制作圣诞树贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析&#x1f338;总结 &#x1f385;圣诞节快乐&#xff01; ❄️Python制作圣诞节贺卡 …

商户如何去申请支付宝小程序以及对接团购(天财商龙)

申请支付宝小程序的前提&#xff1a;必须要是支付宝实名认证用户&#xff08;要申请企业支付宝&#xff09; 1.申请企业支付宝 申请网址&#xff1a;支付宝商家后台 https://b.alipay.com 企业支付宝必须是法人扫码进行注册 申请资料&#xff1a;企业的营业执照&#xff0c;没…

simulink代码生成(二)——ADC采样模块

这一节梳理如何使用C2000库中的ADC模块&#xff0c;从而实现采样&#xff1b; 先预留几个问题&#xff0c;逐步进行解决。 &#xff08;1&#xff09;在simulink中C2000的ADC采样模块设置是怎么样的&#xff1f;各个选项卡代表什么&#xff1f; &#xff08;2&#xff09;AD…

【开源】基于JAVA语言的学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…

谷粒商城|仓储服务-仓库管理

配置服务中心 cloud:nacos:discovery:server-addr: 127.0.0.1:8848application:name: guliware在网关配置路由转发 guligateway .yml配置文件 - id: ware_routeuri: lb://guliwarepredicates:- Path/api/guliware/**filters:- RewritePath/api/(?<segment>.*),/$\{segm…

计算机网络复习-OSI TCP/IP 物理层

我膨胀了&#xff0c;挂我啊~ 作者简介&#xff1a; 每年都吐槽吉师网安奇怪的课程安排、全校正经学网络安全不超20人情景以及割韭菜企业合作的FW&#xff0c;今年是第一年。。 TCP/IP模型 先做两道题&#xff1a; TCP/IP协议模型由高层到低层分为哪几层&#xff1a; 这题…

EasyPoi(excel导入导出)

一&#xff0c;依赖包&#xff1a; <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.1.3</version></dependency> 二&#xff0c;官网文档 1. 前言 - Powered…

格密码基础:q-ary格

目录 一. 格密码的重要性 二. 格密码基础 2.1 格点的另一种理解方式 三. q-ary格 3.1 q-ary垂直格 3.2 q-ary格 3.3 二者结合 四. 论文中的q-ary格 4.1 定理1 4.2 定理2 4.3 定理3 一. 格密码的重要性 格密码的基础是研究格点上的困难问题&#xff0c;这种格点使用…

从浮点数度分秒1.40000中无损精度提取1度40分00.0秒的方法

那些最好的程序员不是为了得到更高的薪水或者得到公众的仰慕而编程&#xff0c;他们只是觉得这是一件有趣的事情&#xff01; 从浮点数度分秒1.40000中无损精度提取1度40分00.0秒的方法 &#x1f340;前言&#x1f338;传统的提取方法&#x1f516;算法介绍&#x1f9fe;Python…

Java研学-HTTP 协议

一 概述 1 概念和作用 概念&#xff1a;HTTP 是 HyperText Transfer Protocol (超文本传输协议)的简写&#xff0c;它是 TCP/IP 协议之上的一个应用层协议。简单理解就是 HTTP 协议底层是对 TCP/IP 协议的封装。   作用&#xff1a;用于规定浏览器和服务器之间数据传输的格式…

(企业 / 公司项目)如何使用分布式任务调度框架Quartz集成 和 SpringBoot自带的定时任务集成?

SpringBoot自带的定时任务 首先在你的微服务项目中创建一个新的模块&#xff0c;定时调度模块 pom.xml里面关联公共模块common的依赖其他不需要改变 然后启动类别删&#xff0c;启动项目是否报错&#xff0c;写一个简单的测试类访问路径是否成功 package com.jiawa.train.bat…

力扣日记12.24-【二叉树篇】236. 二叉树的最近公共祖先

力扣日记&#xff1a;【二叉树篇】236. 二叉树的最近公共祖先 日期&#xff1a;2023.12.24 参考&#xff1a;代码随想录、力扣 ps&#xff1a;提前祝 平安夜快乐&#xff01; 236. 二叉树的最近公共祖先 题目描述 难度&#xff1a;中等 给定一个二叉树, 找到该树中两个指定节点…