您的位置:寻梦网首页编程乐园XML 编程XML技术讲座
XML 编程

XML技术讲座之十二

应用程序接口DOM & SAX

作为一个程序开发人员,可能需要通过程序代码,访问一个XML文档中的内容。由于XML文档实际上就是一个文本文件,我们必须书写一个能够识别XML文档中信息的文本文件阅读器--XML语法分析器,用来解释XML文档并提取其中的内容。显然,这不仅是一项非常耗时的工作,而且要求每个应用XML的人都要自己去处理XML中的语法细节。而且,在不同的应用程序或开发环境中,如果多种应用程序都需要访问XML文档中的数据,这样的分析器代码就要被重写多次。这时,你或许会产生这样一个疑问:把XML分析器做成一个DLL不就可以解决代码重写的问题了吗?回答当然是肯定的,但是,如果所有现成的XML分析器的接口都不相同,那么我们的开发就必须是针对某一个XML分析器的,当我们希望更换一个性能更高的分析器时,程序就必须被重写。因此,一个统一的XML数据接口也是必需的。也就是说,要真正实现代码的重用,就必须解决DLL的接口标准问题。

针对上述问题,W3C以及XML_DEV邮件列表的成员分别提出了两个标准的应用程序接口:DOM和SAX。

DOM和SAX在XML应用程序开发过程中的作用如图1所示:


图1 DOM和SAX在应用程序开发过程中的作用

DOM简介

DOM的全称是Document Object Model,也即文档对象模型。它是由W3C制定的一套标准接口规范。在应用程序中,基于DOM的XML分析器将一个XML文档转换成了一个对象模型的集合(这个集合通常被称为DOM树),应用程序可以通过对该DOM树的操作,实现对XML文档中数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。

XML的一个显著特征就是它是结构化的。在结构化文档中,信息是按层次化的树形结构组织的。所以结构化文档模型的组织也必然是树形的。一个DOM接口的XML分析器,在对XML文档进行分析之后,不管这个文档有多简单还是有多复杂,文档中的信息都会被转化成一棵对象节点树。在这棵节点树中,有一个根节点--Document节点,所有其他的节点都是根节点的后代节点。DOM节点树生成之后,就可以通过DOM接口访问、修改、添加、删除、创建树中的节点和内容。例如,对于下面的XML文档:

<?xml version="1.0" encoding="gb2312" ?>
<books>
<book>
<author>破破</author>
<title>XML入门</title >
</book>
<book>
<author>坏坏</author>
<title>XML提高</title>
</book>
</books>

用DOM分析器分析之后,就会得到如图2所示的树结构。

在这棵文档对象树中,文档中所有的内容都是用节点来表示的。一个节点又可以包含其他节点,节点本身还可能包含一些信息,例如节点的名字、节点值、节点类型等。

由图2可以看出,在DOM中,文档的逻辑结构类似一棵树。文档、文档中的根、元素、元素内容、属性、属性值等都是以对象模型的形式表示的。文档中的根实际上也是一个元素,之所以要把它单独列出来,是因为在XML文档中,所有其他元素都是根元素的后代元素,而且根元素是唯一的,具有其他元素所不具有的某些特征。

图2中给出的例子比较简单,事实上,DOM中还包含注释、处理指令、文档类型、实体、实体引用、命名空间、事件、样式单等多种对象模型。

SAX简介

SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。它是XML_DEV邮件列表中的成员根据应用的需求自发地定义的一套对XML文档进行操作的接口规范。SAX提供了一种对XML文档进行顺序访问的模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,从而完成对XML文档的访问,所以 SAX接口也被称作事件驱动接口。

SAX接口之所以叫做"简单"应用程序接口,是因为这个接口确实非常简单,绝大多数事情分析器都没有做,需要应用程序自己去实现。它的基本原理是由接口的使用者提供符合定义的处理器,XML分析时遇到特定的事件,就去调用处理器中特定事件的处理函数。一般SAX接口都是用JAVA实现的,但事实上C++也可以用于实现SAX接口,只是C++的分析器比较少。

SAX分析器的大体构成框架如图3所示:

对于下面的XML文档:

<?xml version = "1.0" encoding="gb2312"?>
<books>
<book>
<title>XML入门</title>
<author>小喆喆</author>
<publisher>北京大学出版社</publisher>
<email>xml@icst.pku.edu.cn</email>
</book>
</books>

当利用SAX分析器中的DocumentHandler接口中的方法对文档进行分析时,方法的调用时序如图4所示:


图4 SAX接口方法调用时序图

总结

DOM分析器通过对XML文档的分析,把整个XML文档以一棵DOM树的形式存放在内存中,应用程序可以随时对DOM树中的任何一个部分进行访问与操作,也就是说,通过DOM树,应用程序可以对XML文档进行随机访问。这种访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当XML文档比较大或者文档结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项比较耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器的树结构的思想与XML文档的结构相吻合,而且,通过DOM树机制很容易实现随机访问,因此,DOM分析器还是有很广泛的使用价值的。

SAX分析器在对XML文档进行分析时,触发一系列的事件,应用程序通过事件处理函数实现对XML文档的访问。由于事件触发本身是有时序性的,因此,SAX分析器提供的是一种对XML文档的顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。SAX之所以被叫做"简单"应用程序接口,是因为SAX分析器只做了一些简单的工作,大部分工作还要由应用程序自己去做。也就是说,SAX分析器在实现时,它只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分,检查是否符合XML语法并触发相应的事件。对于事件处理函数本身,要由应用程序自己来实现。同DOM分析器相比,SAX分析器对XML文档的处理缺乏一定的灵活性,然而,对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说,SAX分析器的效率则更高。由于SAX分析器实现简单,对内存要求比较低,因此实现效率比较高,同样具有广泛的使用价值。

来源:网络世界