当前位置: 首页 > 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		实现“访问者模式”的接口

相关文章:

【XML】TinyXML 详解

1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&#xff0c;因此可以在开源或商业代码中…...

泛社交裂变场景下AB增量科学评估方案

在数据驱动业务的大环境下&#xff0c;AB实验是对策略效果进行评估的重要指南针&#xff0c;并广泛应用在用增/推荐/搜索/内容/商业化等多个领域&#xff0c;尤其是综合评估多个策略对于大盘影响的对比效果&#xff0c;AB增量的计算就尤为重要。 背景 现在普遍常见的泛社交裂变…...

【无标题】json报错

操作失败&#xff0c;JSON parse error: Cannot deserialize value of type com.alibaba.fastjson.JSONArray from String value (token JsonToken.VALUE_STRING); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize valu…...

MyBatis中延迟加载,全局和局部的开启使用与关闭

文章目录 MyBatis中延迟加载&#xff0c;全局和局部的开启使用与关闭1、问题提出2、延迟加载和立即加载延迟加载立即加载 3、三种对应的表关系中的加载4、打开全局延迟加载&#xff08;实现一对一的延迟加载&#xff09;5、实现一对多的延迟加载&#xff08;将上面设置的全局延…...

MyBatis增删改查基础及其xml文件

目录 一.增删改查基础 1.增 增Insert 获取自增ID 对insert参数进行重命名 2.删 3.改 4.查 1)对MySQL查询结果进行重命名 从MySQL层面--as 从mybatis层面--Results注解 复用Results的定义 2)配置自动转换驼峰命名&#xff08;推荐&#xff09; 二.Mybatis xml配置…...

视觉学习(1)—— 理论

一、提问 初入视觉的几个问题&#xff1a; 1、视觉是怎么被控制的 2、怎么让视觉启动 3、视觉需要完成什么东西 4、视觉启动如何将完成的东西反馈给我 二、回答 1、视觉都是通过通讯协议控制&#xff0c;如串口、Modbus TCP等协议 2、视觉中的所有功能块都在流程中&…...

pip 常用指令 pip list 命令用法介绍

&#x1f4d1;pip 常用命令归类整理 pip list 是一个用于列出已安装的 Python 包的命令。这个命令会显示出所有已安装的包&#xff0c;以及它们的版本号。 pip list 命令有以下参数 -o, --outdated&#xff1a;列出所有过时的包&#xff0c;即有新版本可用的包。-u, --uptod…...

【DP】62.不同路径

题目 法1&#xff1a;二维DP 必须掌握&#xff01; class Solution {public int uniquePaths(int m, int n) {int[][] matrix new int[m][n];Arrays.fill(matrix[0], 1);for (int i 0; i < m; i) {matrix[i][0] 1;}for (int i 1; i < m; i) {for (int j 1; j <…...

大数据、知识图谱和强化学习的综合应用

大数据、知识图谱和强化学习各自在不同的方面都发挥了重要作用&#xff0c;它们分别涉及了大规模数据的处理和挖掘、基于图的数据结构和信息提取&#xff0c;以及基于奖励反馈的决策制定。将它们结合使用&#xff0c;可以构建出更加强大和智能的系统。以下是一些可能的应用场景…...

MFC使用高速绘图控件high-speed Charting Control绘制柱形图

1. 创建MFC单文档工程BarChartDemo。 2. 在工程文件夹下新建文件夹ChartCtrl,将ChartCtrl源码放入,如下图所示。在工程中添加这些项,项目——添加——现有项,全部添加。 3. 添加一个对话框,ID为IDD_DLG_BAR,类名为CBarDlg。 4. 在对话框中添加Custom Control控件,将控…...

vue3 H5项目中实现PDF预览

是需要npm i vue-pdf-embed 安装这个插件的&#xff0c;可兼容ios/Android&#xff0c;下面是本人的使用实例 <template><div class"conten_box"><vue-pdf-embed v-if"pdfSource.url" :source"pdfSource" /></div> <…...

【WebRTC---源码篇】(十一:一)采集编码发送期间使用时间戳的详细解读

一、时间戳定义 1、 NTP时间 NtpTime RealTimeClock::CurrentNtpTime() //获取从1900-01-01 00:00.00到当前时刻经过的时间 int64_t RealTimeClock::CurrentNtpInMilliseconds() //获取从1900-01-01 00:00.00到当前时刻经过的毫秒数,ms int64_t rtc::TimeUTCMicros() //获取…...

Python学习路线 - Python语言基础入门 - Python异常、模块与包

Python学习路线 - Python语言基础入门 - Python异常、模块与包 了解异常什么是异常bug单词的诞生异常演示 异常的捕获方法为什么要捕获异常捕获常规异常捕获指定异常捕获多个异常捕获异常并输出描述信息捕获所有异常异常 else异常的finally 异常的传递Python模块什么是模块模块…...

eventbus,在this.$on监听事件时无法在获取数据

问题&#xff1a;vue中eventbus被多次触发&#xff0c;在this.$on监听事件时&#xff0c;内部的this发生改变导致&#xff0c;无法在vue实例中添加数据。 项目场景 一开始的需求是这样的&#xff0c;为了实现两个组件(A.vue ,B.vue)之间的数据传递。 页面A&#xff0c;点击页面…...

【Python必做100题】之第二十五题(统计字符)

题目&#xff1a;输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其他字符的个数 代码如下&#xff1a; string input("请输入字符串:")char 0 number 0 space 0 other 0for i in string:if i.isalpha():char 1elif i.isdigit():number 1eli…...

开发语言:ArkTS

简介 ArkTS是华为为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;开发的一种应用开发语言。这种语言在TypeScript&#xff08;简称TS&#xff09;的基础上进行了扩展&#xff0c;以更好地适应鸿蒙系统的特点和开发需求。ArkTS不仅继承了TS的所有特性&#xff0c;而且还对TS的…...

Qt中字符串转换为JS的函数执行

简介 在 QML 中&#xff0c;将 JavaScript 字符串转换为函数通常涉及使用 Function 构造函数或 eval() 函数。但是&#xff0c;QML 的环境对 JavaScript 的支持有一定的限制&#xff0c;因此不是所有的 JavaScript 功能都可以在 QML 中直接使用。 以下介绍都是在Qt5.12.1…...

TCP/IP:从数据包到网络的演变

引言 TCP/IP协议的起源可以追溯到20世纪60年代末和70年代初&#xff0c;美国国防部高级研究计划局&#xff08;ARPA&#xff09;研究开发一种可靠的通信协议&#xff0c;用于连接分散在不同地点的计算机和资源。 在当时&#xff0c;计算机之间的连接并不像现在这样普遍和便捷…...

闪存驱动器与机械硬盘与固态硬盘

目录 U盘&#xff08;闪存驱动器&#xff09; 固态硬盘&#xff08;SSD&#xff09; 机械硬盘&#xff08;HDD&#xff09; 目前主流 U盘&#xff08;闪存驱动器&#xff09; U盘是便携式存储设备&#xff0c;内部采用闪存芯片作为存储介质。它们通常具有小巧轻便的外形&am…...

java String转asc码,然后ascII再转四位的16进制数。

理论知识补充&#xff1a; char是Java中的保留字&#xff0c;表示一种数据类型。与别的语言不同的是&#xff0c;char在Java中是16位的&#xff0c;因为Java用的是Unicode编码。不过8位的ASCII码包含在Unicode编码中&#xff0c;其值对应十进制的表示范围是0~127。 char是Java八…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...