曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
分复杂,这个缺点不会太显著。然而,假设你在处理X M L文档的开始处之前就需要访问X M L文
档末尾的信息,你不得不解析两次文件,或者重新考虑X M L文档的结构,并修改生成它的应用
程序。
第二个有关关系位置的问题很容易解决,你只需要编写维护基于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过滤器,例如:
程序清单1 7 - 5
产生S A X事件s t a r t E l e m e n t时,我们将元素名称入栈,并有效地构造X P a t h。产生S A X事件
e n d E l e m e n t时,我们删除元素名称。堆栈最初包含“ /”,它是文档的根。随着S A X事件的产生,
逐步建立堆栈,事件以及X P a t h将一起被传给下一个处理器。其结果是我们的类将处理类似如下
的事件流:
程序清单1 7 - 6
第17章实例研究3—图书目录信息服务使用727 下载
你可能感觉以上代码与D O M有些类似,从某种角度讲,你可以这样认为,但是你应该记
住在以上堆栈中,我们的内存中只有一个图书实例,然而如果采用D O M,内存中可能会
有上千个实例—因此空闲内存极少。
B C I S是建立在一种转换技术基础之上的,该技术已经发展成为通用的转换引擎,并应用于本
实例研究。转换操作并不是根据X S LT样式表执行的,它使用一个或多个类,这些类作为S A X事件
被调用,同时附加与S A X事件流匹配的某些样式( X P a t h)。这种方法使得B C I S具有很高的性能,
因为伪样式表是经过编译的,而且根据S A X事件流转换文档更加简单,因为你不必跟踪事件嵌套。
这种方法比单纯的X S LT更加灵活,因为你可以利用常用的开发语言进行转换,这些语言可
能允许数据库查询等操作(这在标准X S LT中是无法实现的)。另一个我个人非常推崇的优点是在
执行非常复杂的转换时,你不必纠缠于相当繁琐的X S LT语法,它有助于提高程序的编写效率。
为了理解转换引擎的优点和工作原理,考虑图1 7 - 6所示的典型的S A X应用程序。
图17-6
首先解析X M L文档,然后由实现了SAX DocumentHandler类的类处理S A X事件。如果处理
器代码要定位< B o o k s >中的所有< B o o k >元素,它将有如下代码:
程序清单1 7 - 7
728使用XML 高级编程
下载
SAX解析器SAX事件流转换类
S A X事件通过s N a m e传递起始标记名称,通过p A t t r i b u t e L i s t传递起始标记中定义的属性。代
码并不困难,但是定位嵌套多层的元素可能会导致大量状态标志,零乱的代码和错误。除此之
外,如果我们寻找许多元素,事件处理器很快会变得相当庞大。正如我们前面所讨论的,通过
引入附加的层/过滤器将X P a t h添加到事件中,将简化编程模型(参见图1 7 - 7)。
图17-7
由于其他人负责维护元素嵌套(使用前面讨论的堆栈方法),我们就不需要任何标志,代码
简化为如下形式:
程序清单1 7 - 8
对于以上代码,可以用一个复杂的X P a t h进行测试,我们不必担心要在s t a r t E l e m e n t ( )中设置
标志,在e n d E l e m e n t ( )中清除标志。代码变得极其简单,它是本章介绍的实例研究的基础。然而,
如果我们需要搜索大量事件,使用X P a t h并不能解决事件处理器过大的问题。为此,我们将依据
一个或多个X P a t h利用不同的类模块处理S A X事件(参见图1 7 - 8)。
图17-8
第17章实例研究3—图书目录信息服务使用729 下载
SAX解析器SAX事件流XPath过滤器
SAX/Path
事件流
转换类
SAX解析器SAX事件流XPath过滤器
SAX/Path
事件流
/Books/Book
的转换类
/Books/Book/Reviews/
Review的转换类
在上图中,一个类负责处理所有X P a t h为/ B o o k s / B o o k的S A X事件,另一个类负责处理X P a t h
为/ B o o k s / B o o k / R e v i e w s / R e v i e w的S A X事件。我们实现的引擎允许一个类处理任意多个X P a t h,
但是同一X P a t h至多只能由一个类处理。
此时,我们将略微偏离主题,讨论一下将在本章使用的S A X解析器,同时还要涉及一些V B
代码。一旦了解了如何使用解析器,我们将继续创建B C I S。
3. Visual Basic SAX解析器
本章实例研究使用的S A X解析器是由Vivid Creations(h t t p : / / w w w. v i v i d - c r e a t i o n s . c o m)开发
的,它称为A c t i v e S A X。Vi v i d公司在X M L领域颇有名气,它是最初—1 9 9 8年年中—采用非
J a v a(C / C + +,V B等)实现S A X的几家公司之一。对于商业/非商业用途,该解析器都是免费的,
但是如果处理的文件超过1 0 K B,将显示一个不太讨人喜欢的小屏幕。就我们的实例研究而言,
这个限制无所谓,但是如果你打算使用S A X处理大文件,你需要购买完整的拷贝(在编写本书
时,它的价格是9 9英镑或1 4 9美元),或者采用其他解析器。你可以从以下地址下载解析器:
h t t p : / / w w w. v i v i d - c r e a t i o n s . c o m / s a x / i n d e x . h t m。
使用A c t i v e S A X,我们将创建简单的应用程序,并通过列出X M L文档中的所有元素演示如
何使用A c t i v e S A X。需要特别说明的是,本章并不打算详细介绍A c t i v e S A X解析器。
Vi v i d公司的We b站点详细介绍了A c t i v e S A X。站点上提供了许多可下载的X M L样例(S A X
和DOM),相信你会受益匪浅。
首先,你需要从前面列出的U R L下载并安装Vivid ActiveSAX 解析器,创建新的标准E X E
V B项目,并添加对类型库“ Vivid Creations ActiveSAX”的引用。
然后,在缺省的窗体上放置标准的L i s t B o x 控件,在窗体声明的代码模块的顶端声明
S A X P a r s e r类型的变量m _ o S A X P a r s e r:
你会注意到正在使用关键字Wi t h E v e n t s,通过这种方式就能够使用连接点处理来自对象实例
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML高级编程下(67)