`

TinyXml学习笔记

阅读更多

TinyXml学习笔记

张弛 <zhangchi@china.com>

一、      TinyXml 的特点

TinyXml 是一个基于 DOM 模型的、非验证的轻量级 C++ 解释器。

1.      SAX  DOM

目前 XML 的解析主要有两大模型: SAX  DOM 

其中 SAX 是基于事件的,其基本工作流程是分析 XML 文档,当发现了一个新的元素时,产生一个对应事件,并调用相应的用户处理函数。这种方式占用内存少,速度快,但用户程序相应得会比较复杂。

 DOM (文档对象模型),则是在分析时,一次性的将整个 XML 文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,速度往往慢于 SAX ,但可以给用户提供一个面向对象的访问接口,对用户更为友好。

另据说,一些同时提供了 SAX  DOM 接口的库,是在底层先实现 SAX ,再在 SAX 的基础上实现 DOM 

目前我知道的 XML 解析库有下面几个:

名称

访问接口

是否支持验证

备注

Expat

SAX/Local

不清楚

Local 指它还有一套自己访问模型

LibXML2

SAX/DOM

 

 

 

 

TinyXml

DOM

 

 

 

 

XML4C

SAX/DOM

 Xerces-C 是一家,不过用了 ICU ,国际化似乎更好

Xerces-C

SAX/DOM

 

 

 

 

XML Booster

Local

不清楚

这个库不是特别了解,好像是类似 yacc 那样,可以生成一个特定的解析器,估计效率应该很高(看名字也像)。

2.      验证和非验证

对于一个特定的 XML 文档而言,其正确性分为两个层次。首先是其格式应该符合 XML 的基本格式要求,比如第一行要有声明,标签的嵌套层次必须前后一致等等,符合这些要求的文件,就是一个合格的 XML 文件,称作 well-formatted 。但除此之外,一个 XML 文档因其内容的不同还必须在语义上符合相应的标准,这些标准由相应的 DTD 文件或者 Schema 文件来定义,符合了这些定义要求的XML 文件,称作 valid 

因此,解析器也分为两种,一种是验证的,即会跟据 XML 文件中的声明,用相应的 DTD 文件对 XML 文件进行校验,检查它是否满足 DTD 文件的要求。另一种是忽略 DTD 文件,只要基本格式正确,就可以进行解析。

就我所知,验证的解析器通常都是比较重量级的。 TinyXml 不支持验证,但是体积很小,用在解析格式较为简单的 XML 文件,比如配置文件时,特别的合适。

二、      TinyXml 的构建和使用

1.      获取

TinyXml 首页在 http://www.grinninglizard.com/tinyxml/index.html ,从这里可以找到最新版本的源代码,目前的版本是 2.3.4 

2.      构建

TinyXml 在构建时可以选择是否支持 STL ,选择的话,则可以使用 std::string ,所以通常应该打开这个选项。

 Windows 上, TinyXml 的源码包里提供了 VC6 的工程文件,直接用它就可以生成两个静态库(带 STL 和不带 STL ),非常容易。唯一需要注意的是,默认生成的库是单线程的,如果用在多线程的项目中,需要改动一下配置,生成相应的多线程库。

 Unix 平台上, TinyXml 的源码包里只提供了一个 Makefile ,对于典型的 Linux 系统,或装了 gcc  gmake 的其他 Unix ,这个Makefile 足够用了,我在 RH9  RHEL4 上测试,简单的 make 就成功了。需要注意的有以下几点:默认的编译是不支持 STL 的,可以通过编辑 Makefile  TINYXML_USE_STL := NO 那一行,把 NO 改成 YES 就可以支持 STL 了;还有默认只生成了一个测试程序,没有生成任何库,如果要生成静态库的话,可以用 ar 命令,将生成的几个目标文件打包就行了,如果要生成动态库,则需要加上 -fpic 参数重新编译。

3.      使用

构建了相应的库之后,在使用了它们的工程中,只要在连接时把他们连上就行了。需要注意的是,如果需要 STL 支持,在编译用到了 TinyXml 的文件时,需要定义一个宏 TIXML_USE_STL ,对 gcc ,可以使用参数 -DTIXML_USE_STL ,对 cl.exe  VC ),可以使用参数 /DTIXML_USE_STL ,如果嫌麻烦,可以直接定义在 tinyxml.h 文件里。

三、      TinyXml 的编程模型

1.      类之间的关系

TinyXml 实现的时 DOM 访问模型,因此提供了一系列的类对应 XML 文件中的各个节点。主要类间的关系如下图所示:

 

TiXmlBase :其他类的基类,是个抽象类

TiXmlNode :表示一个节点,包含节点的一般方法,如访问自节点、兄弟节点、编辑自身、编辑子节电

TiXmlDocument :表示整个 XML 文档,不对应其中某个特定的节点。

TiXmlElement :表示元素节点,可以包含子节点和 TiXmlAttribute

TiXmlComment :表示注释

TiXmlDeclaration :表示声明

TiXmlText :表示文本节点

TiXmlUnknown :表示未知节点,通常是出错了

TiXmlAttribute :表示一个元素的属性

下面是一个简单的例子:

<?xml version="1.0" encoding="utf-8" ?>
<!-This is only a sample-->
<book>
       <name>TinyXml How To</name>
       <price unit=”RMB”>20</price>
       <description>Some words…</description>
</ book >
 

整个文档,对应 TiXmlDocument

book,name,price , description ,都对应 TiXmlElement

第一行对应一个 TiXmlDeclaration

第二行对应一个 TiXmlComment

“TinyXml How To” 对应一个 TiXmlText

unit 则是 price 的一个 TiXmlAttribute

这些类与 XML 文件中的相应元素都有很好的对应关系,因此相信参照 TinyXml 的文档,可以很容易的掌握各个方法的使用。

2.      需要注意的问题

各类之间的转换

由于各个节点类都从 TiXmlNode 继承,在使用时常常需要将 TiXmlNode * 类型的指针转换为其派生类的指针,在进行这种转换时,应该首先使用由 TiXmlNode 类提供的一系列转换函数,如 ToElement (void) ,而不是 c++  dynamic_cast

检查返回值

由于 TinyXml 是一个非校验的解析器,因此当解析一个文件时,很可能文件并不包含我们预期的某个节点,在这种情况下,TinyXml 将返回空指针。因此,必须要对返回值进行检查,否则将很容易出现内存访问的错误。

如何重头建立一个 XML 文件

先建立一个 TiXmlDocument 对象,然后,载入某个模板,或者直接插入一个节点作为根节点,接着就可以像打开一个已有的 XML文件那样对它进行操作了。

四、      总结

TinyXml 最大的特点就是它很小,可以很方便的静态连接到程序里。对于像配置文件、简单的数据文件这类文件的解析,它很适合。但是由于它是非验证的,因此需要在程序里做许多检查工做,加重了程序编写的负担。因此对于复杂的 XML 文件,我觉得最好还是用验证的解析器来处理。

 

分享到:
评论

相关推荐

    tinyxml与tinyxml2

    TinyXML和TinyXML2是两个小型的开源库,专门用于解析和操作XML(eXtensible Markup Language)文档。这两个库都是用C++编写的,为C++开发者提供了方便的接口来读取、写入和操作XML数据。下面将详细介绍这两个库的...

    TinyXml使用笔记

    这篇“TinyXml使用笔记”将深入探讨如何利用这个库进行XML操作。 首先,TinyXml库包含几个核心类,它们是`TiXmlDocument`、`TiXmlElement`、`TiXmlAttribute`、`TiXmlText`、`TiXmlComment`、`TiXmlDeclaration`...

    tinyxml2.h tinyxml2.cpp文件

    TinyXML-2,通常以tinyxml2库的形式存在,是一个轻量级的C++库,专门用于解析和操作XML文档。这个库由李·斯坦普(Lee Stemp)开发,设计简洁,易于集成到各种项目中,特别是对于嵌入式系统和资源有限的环境。在给定...

    TinyXML学习资料

    在学习TinyXML的过程中,阅读提供的“TinyXML学习资料.pdf”文件会非常有帮助。这份资料可能涵盖了TinyXML的基本概念、用法示例以及常见问题的解决方案。通过深入学习,你将能够熟练地利用TinyXML进行XML的解析和...

    tinyxml2 version 9.0.0下载地址

    TinyXML2是一个小型、快速且易于使用的XML解析库,主要用于C++编程。版本9.0.0是该库的一个更新版本,提供了最新的功能和错误修复。在这个版本中,开发者可以期待更加稳定和优化的XML处理性能。 TinyXML2的设计目标...

    QT使用TinyXML开源库解析XML文件

    1. **下载和解压TinyXML**:从TinyXML的官方网站或者其他可靠的源下载最新版本的TinyXML库,解压缩后得到头文件(如tinyxml.h)和源文件(如tinyxml.cpp)。 2. **添加TinyXML到QT项目**:将这些文件复制到你的QT...

    tinyxml+tinyxpath+tinyxml++最新套件(20080916)

    在`TinyXMLHelp_v2.5.3.chm`文件中,包含的是TinyXML的离线帮助文档,对于学习和理解TinyXML的用法非常有帮助。CHM文件是Windows的 Compiled HTML Help 格式,可以像查看传统软件帮助一样,查阅TinyXML的API、示例和...

    tinyxml2最新版本(来自github)

    TinyXML2是一个轻量级的XML解析库,主要用于读取和写入XML文档。这个库由Steve Baker开发,它的最新版本在2017年8月17日更新,这表明了开发者持续对库进行维护和改进以适应不断变化的编程需求。在本文中,我们将深入...

    TinyXML2使用示例

    总之,“TinyXML2使用示例”提供了学习和实践XML解析的实例,通过分析`test_tinyxml2.cpp`的代码,我们可以深入理解TinyXML2库的工作原理,并学会如何在实际项目中应用XML配置文件。同时,对于`CXMLCfg`类的设计和...

    tinyxml2源码及示例

    TinyXML2是一个轻量级的XML解析库,主要由C++编写,旨在提供简单、高效的方式来读取和写入XML文档。它适用于各种平台,包括桌面系统和移动系统,如Android。这个库的设计目标是小巧且易于理解,使得开发者能够快速地...

    XML解析工具- TinyXML2 -源代码 - C++

    TinyXML-2 是一个简单、小型、高效的 C++ XML 解析器,可以被轻松集成到其他程序中。它使用文档对象模型(DOM)的方式解析XML,可解析 XML 文档,并根据该文档构建可读取、修改和保存的文档对象模型。 作为XML解析...

    tinyxml2解析和创建xml样例

    TinyXML2是一个小型、快速且易于使用的C++库,用于解析和生成XML文档。这个库的设计目标是简单、高效,并且适用于嵌入式系统。在本文中,我们将深入探讨如何使用TinyXML2来解析和创建XML文件,特别是涉及到CDATA区段...

    使用tinyxml 读写xml文件方法

    TinyXML 是一个小型、开源的 C++ 库,专门用于解析和生成 XML(eXtensible Markup Language)文档。在本文中,我们将深入探讨如何使用 TinyXML 来读写 XML 文件,以及它在 Visual C++ 开发环境中的应用。 1. **Tiny...

    TinyXML入门教程

    ### TinyXML入门教程知识点详解 #### 一、XML简介与TinyXML概述 - **XML**:全称为**可扩展标记语言**(EXtensible Markup Language),是一种用于标记数据的语言,允许用户自定义数据的标识,从而区分不同类型的结构...

    基于tinyxml2的xml操作库再封装

    TinyXML2是轻量级的C++ XML解析库,它提供了简单、直接的方式来读写XML文档。本项目是基于tinyxml2进行的二次封装,旨在进一步简化XML的操作,提供更友好的API,提升开发效率。 在C++中,原始的tinyxml2库可能需要...

    tinyxml2-master.zip解析xml的c++库

    tinyxml2库解析xml用是c++的 使用轻快方便只需要库中的tinyxml2.cpp和tinyxml2.h放到开发路径下即可使用,如果编译报错fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory,请下载FFmpeg-...

    C++ XML文件解析库 tinyxml2

    **C++ XML文件解析库 TinyXML2** XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于网络服务、配置文件、数据交换、对象序列化等领域。TinyXML2是一个轻量级、高效的C++库,专为解析和操作...

    mfc 利用TinyXml 读取数据操作

    在本文中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)框架下,使用TinyXml库来处理XML文件,实现数据的增加、修改和删除操作。TinyXml是一个小巧且易于使用的C++库,它允许程序员方便地解析和生成XML...

    tinyxml2解析XML文件读取数据

    TinyXML-2(通常简称为tinyxml2)是一个轻量级的C++库,专门设计用来解析和操作XML文档。这个库小巧、简单且易于集成到项目中,尤其适合对性能要求不高的应用。 本项目“tinyxml2解析XML文件读取数据”主要关注如何...

    tinyxml_libtinyxml的缺点_test_tinyxml_keptj4v_解析xml_

    TinyXML是一个开源库,用于解析和操作XML(可扩展标记语言)文档。它以其小巧、轻量级和易于使用而闻名,适用于各种嵌入式和桌面应用。然而,尽管TinyXML在许多项目中表现出色,但它也有一些显著的缺点,这些缺点在...

Global site tag (gtag.js) - Google Analytics