【XML】TinyXML 详解

1、简介

优点:

TinyXML 是一个简单、小型的 C++ XML 解析器,可以轻松集成到项目中。

TinyXML 解析 XML 文档,并根据该文档构建可读取、修改和保存的文档对象模型 (DOM)

TinyXML 是在 ZLib 许可下发布的,因此可以在开源或商业代码中使用它。

TinyXML 支持 UTF-8,允许以任何语言操作 XML 文件。

缺点:

TinyXML 目前不使用或直接支持 wchar、TCHAR 或 Microsoft 的 _UNICODE。

TinyXML 不解析或使用 DTD(文档类型定义)或 XSL(可扩展样式表语言)。

DTD 语法:

xml 复制代码
<!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)打印示例

cpp 复制代码
#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

cpp 复制代码
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 简化检查

cpp 复制代码
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 复制代码
<?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

cpp 复制代码
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.

完整的对应关系如下:

xml 复制代码
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		实现"访问者模式"的接口
相关推荐
武子康20 小时前
Java-39 深入浅出 Spring - AOP切面增强 核心概念 通知类型 XML+注解方式 附代码
xml·java·大数据·开发语言·后端·spring
Ll13045252983 天前
基于 COM 的 XML 解析技术(MSXML) 的总结
xml
在代码的海洋中寻找亚特兰蒂斯3 天前
AJAX对于XML和JSON的处理
xml·ajax·json
BinField4 天前
ToolsSet之:XML工具
xml·windows·microsoft
SEO-狼术5 天前
Connect Directly to Oracle XML Data
xml·数据库·oracle
YSoup5 天前
2025年目前最新版本Android Studio自定义xml预览的屏幕分辨率
android·xml·android studio
abcnull6 天前
mybatis的mapper对应的xml写法
xml·sql·spring·mybatis·mapper
Blue桃之夭夭6 天前
HTML、XML、JSON 是什么?有什么区别?又是做什么的?
xml·html·json
小于村6 天前
pom.xml 文件中配置你项目中的外部 jar 包打包方式
xml·java·jar
扶风呀6 天前
pom.xml中标签详解_
xml