APP下载

C++解析XML方法的研究和实现

2012-03-27王超郑清

电脑与电信 2012年5期
关键词:文档容器解析

王超 郑清

(成都理工大学计算机科学与技术学院,四川成都610059)

1.XML简介

可扩展标记语言(Extensible Markup Language,XML),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML是标准通用标记语言(SGML)的子集,非常适合Web传输。XML提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据,是独立于软件和硬件的信息传输工具。

XML与HTML的设计区别是:XML是用来存储数据的,重在数据本身。而HTML是用来定义数据的,重在数据的显示模式。HTML旨在显示信息,而XML旨在传输信息。因此与HTML比起来,XML应用起来更方便,用户可以根据自己得需要存储数据,而无需顾虑格式,XML只要求键值对成对出现,并按照树状结果存储即可。XML允许创作者定义自己的标签和自己的文档结构。

2.C++轻量级解析器Tinyxml

提到用C++解析XML,就不得不提起Tinyxml。Tinyxml是一个基于DOM模型的、非验证的轻量级C++解释器。众所周知,目前XML的解析主要有两大模型:SAX和DOM。

其中SAX是基于事件的,其基本工作流程是分析XML文档,当发现了一个新的元素时,产生一个对应事件,并调用相应的用户处理函数。这种方式占用内存少,速度快,但用户程序相应会比较复杂。而DOM(文档对象模型),则是在分析时,一次性地将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,速度往往慢于SAX,但可以给用户提供一个面向对象的访问接口,对用户更为友好。那何为验证和为非验证呢?首先一个合格的XML文档必须符合其基本的格式要求。例如第一行要有声明,标签的嵌套层次必须前后一致等等。解析器也分为两种,一种是验证的,即会跟据XML文件中的声明,用相应的DTD文件对XML文件进行校验,检查它是否满足DTD文件的要求;另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。Tinyxml是不支持验证的,适合解析比较简单的XML文件,比如配置文件等。

TinyxML是一个开源的解析XML的解析库,所以Tinyxml库在网上即可下载,做了相应的配置之后我们就可以使用它了。首先先介绍一下Tinyxml主要类间的关系。

TiXm lBase:整个TinyXML模型的基类。

TiXm lAttribute:对应于XML中的元素的属性。

TiXm lNode:对应于DOM结构中的节点。

TiXm lComment:对应于XML中的注释。

TiXm lDeclaration:对应于XML中的申明部分。

TiXm lDocument:对应于XML的整个文档。

TiXm lElement:对应于XML的元素。

TiXm lText:对应于XML的文字部分。

TiXm lUnknown:对应于XML的未知部分。

TiXm lHandler:定义了针对XML的一些操作。

在使用TinyXm l时有一点需要我们注意,因为它是不支持验证的,所以当我们解析某个文件的时候,要检查返回的指针是否为空,否则会出现内存的访问错误。

3.C++解析XML配置文档的应用研究

C++的开发离不开STL(标准模板库)的使用。STL(标准模板库)是在惠普实验室中开发的,已纳入ANSI/ISO C++标准。其中的代码采用模板类及模板函数的方式,可以极大地提高编程效率。STL中几个关键基本概念是我们必须要知道的。首先是容器:可容纳各种数据类型的数据结构。其次是迭代器:可依次存取容器中元素的东西。还有最重要的算法:用来操作容器中的元素的函数模板。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。而容器分为三大类:

(1)顺序容器。vector:后部插入/删除,直接访问;deque:前/后部插入/删除,直接访问;list:双向链表,任意位置插入/删除。(2)关联容器。set:快速查找,无重复元素;multiset:快速查找,可有重复元素;map:一对一映射,无重复元素,基于关键字查找;multimap:一对一映射,可有重复元素,基于关键字查找。前两者合称为第一类容器。3)容器适配器。stack:LIFO;queue:FIFO;priority_queue:优先级高的元素先出。

在使用XML做配置文件的时候,基于XML的特殊性,我们很容易联想到使用关联容器存储我们解析出来的数据。而map无疑是我们最好的选择。我们将从XML读出来的配置信息存放在map中。map中存放的是成对的key/value。根据key对元素进行排序,可快速地检索元素。当我们要查询配置信息的时候,可以高效地得到我们所需的查询结果。本文就是使用map作为存储容器,结合Tinyxml的使用,达到高效的对XML配置文档的解析。应用关键代码如下:

4.总结

以上程序可以帮助我们读取XML文档中第三级子节点的信息,我们可以根据实际需要增加循环或者嵌套语句来读取更深级别的节点信息。通过以上程序,我们可以看出C++与Tinyxm l相结合可以帮助我们快速读取XML文档中的配置信息,也体现了Tinyxm l最大的特点,即能够快速地静态连接到程序里面。但由于Tinyxm是非验证的,所以我们在实际应用中要慎重考虑,避免不必要的检查工作。

[1] 李普曼(Stanley B.Lippman)等.C++Primer中文版[M].李师贤、蒋爱军等译.第4版.北京:人民邮电出版社,2008.

[2] 杨柳青.TinyXml在Linux平台中的应用研[J].机械工程与自动化,2009(5):41-43.

[3] 孙晓非等编著.XM L基础教程与实验指导[M].清华大学出版社,2008.

猜你喜欢

文档容器解析
浅谈Matlab与Word文档的应用接口
容器倒置后压力压强如何变
有人一声不吭向你扔了个文档
三角函数解析式中ω的几种求法
难以置信的事情
睡梦解析仪
电竞初解析
对称巧用解析妙解
基于RI码计算的Word复制文档鉴别
Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat