TinyXML初学

来源:互联网 发布:里皮的水平知乎 编辑:程序博客网 时间:2024/06/05 04:23

由于需要解析xml,不免要接触一下,对比了各个xml解析库,虽然TinyXML的速度和效率不是最高,但是理解和使用较为简单,所以今天就把学习到的内容做一个总结,基本上都是收集自网络,谢谢各位前辈的总结。


1.XML是什么

XML 代表Extensible Markup Language(eXtensible Markup Language的缩写,意为可扩展的标记语言)。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。


2.DOM是什么

DOM是文档对象模型的简称。一个XML文件是由若干XML元素组成的,用一个树形结构可以表示各个XML元素之间的顺序关系以及嵌套包含关系。在树形结构的基础上,结合面向对象的思想,可以将“树”进一步抽象成N个不同的对象,就形成了文档对象模型。


3.TinyXML是什么

1).TinyXML是目前非常流行的一款基于DOM模型的XML解析器,简单易用且小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。

2).TinyXML是一个开源的XML的解析类库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而方便地访问和操作XML结构树。

简言之,TinyXML是一个简单的,轻量级的,由C++实现的XML文档的解析器,它可以被其它程序方便地集成进去使用。总结四个特点,XML、DOM、开源、跨平台。


4.TinyXML获取地址

TinyXML的首页 http://www.grinninglizard.com/tinyxml,可以从这里可以获得最新版本的源代码。

TinyXML在SourceForge的项目主页 http://sourceforge.net/projects/tinyxml/


5.TinyXML的类结构


<?xml version="1.0" standalone=no><!–Comment-><RootElement>    <Element Attribute="1">Text</Element></RootElement>

TinyXML的各个类与上面文档中的各个XML元素的对应关系是:

TiXmlBase:由关系图可以看出,它是所有类的基类;

TiXmlElement和TiXmlAttribute:对应于XML元素以及元素属性;例如 <Element Attribute="1"></Element>

TiXmlNode:表示一个节点;例如 <RootElement>

TiXmlComment:对应于XML注释,即文档的第二行;例如 <!–Comment->

TiXmlDeclaration:对应于XML文档声明,即文档的第一行;例如 <?xml version="1.0" standalone=no>

TiXmlDocument:对应于整个XML文档;

TiXmlText:对应于XML文档中的文字部分;例如 Text

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

TiXmlVisitor:遍历器接口,描述了每个节点的处理方法,由子类实现;

TiXmlPrinter:Printer遍历器;


6.一个小例子

先将TinyXML解压,拷贝其中tinystr.h,tinyxml.h,tinystr.cpp,tinyxml.cpp,tinyxmlerror.cpp,tinyxmlparser.cpp六个文件加入工程。在工程目录下写一个如下xml一样的待解析文件。

<?xml version="1.0" encoding="utf-8"?><filecomp status="err"><f><name>server.ini</name><size>493</size><crc>0AEFCC64</crc></f><f><name>server.ini</name><size>491</size><crc>50AF176B</crc></f></filecomp>

#include "tinyxml.h"#include <stdio.h>int main(){const char* filepath = "BC.xml";  TiXmlDocument doc(filepath);  bool rs = doc.LoadFile();  if (!rs){exit(1);}TiXmlElement* root = doc.RootElement();for(TiXmlNode* item = root->FirstChild("f"); item; item = item->NextSibling("f")) {TiXmlNode* child = item->FirstChild();const char* name = child->ToElement()->GetText();if (name) {printf("name:%s\n", name);} else {printf("\n");}child = item->IterateChildren(child);const char* size = child->ToElement()->GetText();if (size) {printf("size:%s\n", size);} else {printf("\n");}child = item->IterateChildren(child);const char* crc = child->ToElement()->GetText();if (crc) {printf("crc:%s\n", crc);} else {printf("\n");}printf("\n");}}

根据代码应该比较好理解其中的含义,解析结果如下。



7.TingXML剖析(转自http://www.wuzesheng.com/?p=260)

<?xml version="1.0" standalone=no><!--Our to do list data--><ToDo><Item priority="1"> Go to the <bold>Toy stone!</bold></Item><Item priority="2"> Do bills</Item></ToDo>

1).TinyXML把xml文档建立成一棵DOM(Document Object Model)树,具体实现用的是firstchild-nextsibling tree。



上图中蓝色的指向first child,红色的指向last child, 绿色的指向next sibling, 紫色的指向previoud sibling, 黑色的指向parent。


2).结合TinyXML的类结构,得出对应关系如下。



3).再看一棵DOM树。

<bookstore>  <book category="cooking">    <title lang="en">Everyday Italian</title>     <author>Giada De Laurentiis</author>     <year>2005</year>     <price>30.00</price>   </book></bookstore>



4).总结DOM树的特点。

a.在节点树中,顶端的节点成为根节点;

b.根节点之外的每个节点都有一个父节点;

c.节点可以有任何数量的子节点;

d.叶子是没有子节点的节点;

e.同级节点是拥有相同父节点的节点;



到这里对于TinyXML的也有一个初步的了解,至于如何解析xml,还需要不断实践,查询官方说明文档了,http://www.grinninglizard.com/tinyxmldocs/index.html

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

2.默认生成的TinyXML库是单线程的,如果用在多线程的项目中,需要改动一下配置,生成相应的多线程库。

原创粉丝点击