• 热门标签

当前位置: 主页 > 航空资料 > 计算机 >

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin
曝光台 注意防骗 网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者

载到内存中而造成的开销,可以使用S A X等事件驱动的解析器处理大型X M L文件,我们将在下
一章介绍S A X。
144使用XML 高级编程
下载
下载
第6章SAX 1.0:XML简易API
在第5章里考虑了如何使用文档对象模型( D O M )编写应用程序。本章将着眼于处理X M L文档
的另一种方式: S A X接口。我们先论述一下为什么要选择使用S A X接口而不是文档对象模型,
然后通过编写一些简单的应用程序来探究S A X接口技术。本章也将讨论一些设计模式,它们在
创建更复杂的S A X应用程序时会有所帮助。最后本章描述了S A X未来的发展前景。
S A X的接口风格完全不同于文档对象模型。文档对象模型应用程序通过遵循内存中的对象
参照来要求文档中的内容;使用S A X ,解析器通过向应用程序报告解析事件流来告知应用程序文
档的内容。
S A X即X M L简易应用程序编程接口,全称是扩展标记语言简易应用程序编程接口。
从名称上可以看出, S A X接口可以用来编写应用程序以读取X M L文档中存有的数据。S A X
在本质上是一种J a v a接口,本章所有给出的例子也是用J a v a编写的。(因为本章没有足够的篇幅
讲解J a v a 技术,为此我们假设读者已具有了J a v a 的相关知识。参见Wr o x 出版社出版的
《Beginning Java2 》,ISBN 1861002238 ;也可以在h t t p : / / w w w. j a v a . s u n . c o m查找到更多的信
息。)
S A X接口事实上被所有的Java XML 解析器支持,而且兼容性非常好。参看h t t p : / / w w w.
x m l s o f t w a r e . c o m或David Megginson的站点h t t p : / / w w w. m e g g i n s o n . c o m / S A X /列出的一些实例。
在用J a v a编写S A X应用程序前,你需要安装S A X类(当然要先安装Java JDK)。大多数情况
下你会发现X M L解析器自动帮你安装了S A X类(稍后我们将告知如何快捷地获取这些解析器)。
检查在你的类路径中是否包含如o rg . x m l . s a x . P a r s e r 的类, 如果没有, 你可以从
h t t p : / / w w w. m e g g i n s o n . c o m / S A X /安装这些类。我们随后将介绍一下关于S A X的起源与发展趋势。
但是现在我们将仅提及它最显著的一个特性: S A X不属于任何标准组织或团体,也不属于任何
公司或个人;它是供任何人实现与使用的一种计算机技术。尤其与大多数X M L标准族的不同之
处在于,S A X和W 3 C组织没有任何关系。
S A X的开发工作由David Megginson负责协调, S A X的规范可在David Megginson的站点查找
(h t t p : / / w w w. m e g g i n s o n . c o m / S A X/。这个规范中有些不重要的编辑方面的修改,对本书附录C中
的相关约定进行了再版。
6.1 事件驱动接口
从程序中读取X M L文档基本上有三种方式:
• 把X M L只当做一个文件读取,然后自己挑选出其中的标签。这是黑客们的方法,我们不推
荐这种方式。你很快会发现处理所有的特殊情况(包括不同的字符编码,例外约定,内部
和外部实体,缺省属性等)比想象的困难得多;你可能不能够正确地处理所有的特殊情况,
这样你的程序会接收到一个非常规范的X M L文档,却不能正确地处理它。要避免这种想法:
X M L解析器似乎并不昂贵(大多数是免费的)。
• 可以用解析器分析文档并在内存里创建对文档内容树状的表达方式:解析器将输出传递给
文档对象模型,即D O M。这样程序可以从树的顶部开始遍历,按照从一个树单元到另一
个单元的引用,从而找到需要的信息。
• 也可以用解析器读取文档,当解析器发现标签时告知程序它发现的标签。例如它会告知它
何时发现了一个开始标签,何时发现了一些特征数据,以及何时发现了一个结束标签。这
叫做事件驱动接口,因为解析器告知应用程序它遇到的有含义的事件。如果这正是你需要
的那种接口,可以使用S A X。
让我们更加详细地看一下事件驱动解析过程。
你可能已经在用户接口编程中遇到过“事件驱动”这个术语,用来编写应用程序以响应发
生的如鼠标点击等事件。事件驱动解析器和其类似:特别是你必须习惯于应用程序不是你所控
制这一概念。一旦事情要开始发生,你不需要调用解析器,而是解析器调用程序。开始看起来
有些奇怪,但是一旦你习惯了,这就不是个问题。实际上,它比用户接口编程更容易,因为不
需要忙于处理随时发生的鼠标事件, X M L要解析的事件按照相对可预见的顺序出现。X M L元素
必须完全成对出现,所以你可以知道每个已经打开的元素随后肯定会被关闭。
下面是一个简单的X M L文件:
程序清单6 - 1
当解析器进行处理时,它会调用一连串方法,如下所示(我们将在后面描述实际的方法命名与参
数,这里仅为例证说明):
程序清单6 - 2
你的应用程序提供当s t a r t E l e m e n t和e n d E l e m e n t等事件发生时需要调用的方法。
为什么使用事件驱动接口
假如可以选择的话,那么知道什么情况下使用S A X这样的事件驱动接口最好,或者在什么时
候使用D O M这样基于树结构的接口更好一些是很重要的。
这两种接口都已经很好地标准化并得到广泛的支持,因此不管使用哪一种接口,都有很多
性能良好的解析器可供选择,而且大部分是免费的。实际上很多解析器同时支持两种接口。
146使用XML 高级编程
下载
1. SAX的优点
下面的部分简述了S A X接口最显著的一些优点。
(1) 可以解析任意大小的文件
因为S A X不需要把整个文件加载到内存,所以对内存的占用一般比D O M小得多,而且不随
着文件大小的增加而增加。当然D O M使用的实际内存数量要视解析器而定,但在大多数情况下
一个1 0 0 K b的文档至少要占用1 M b的内存。
但是有一点要注意:如果S A X应用程序自身在内存中创建文档的表达,它会占用和允许
解析器创建空间一样大小的内存。
(2) 适合创建自己的数据结构
应用程序可能会想用如书、作者以及出版者这样的高级对象而不是一些低级元素、属性和
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程上(56)