曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
的自然扩展。
XSL 处理模型(第9章中将讨论)可以被看作是一个基于规则编程的例子。所有X S L模板制
定一个规则:事件处理源文档中的节点;条件控制激活哪个模板的模式;操作是模板的主体部
分。可以使用S A X应用程序中相同的概念。
图6 - 3说明了一个基于规则S A X应用程序的结构。从X M L解析器得到的输入传到一个开关,
开关根据已经定义的条件分析事件,决定激活哪个动作。然后操作被传递给设计用于实现特定
任务的处理模块。
图6-3
可以实现各种类型的条件和操作,但是下面描述一个非常简单的实现,它的条件只基于一
个元素类型。
首先,需要编写D o c u m e n t H a n d l e r。因为它的工作是把处理操作切换到处理特定元素类型的
一段代码,所以可以称它为开关器( S w i t c h e r)。
第6章SAX 1.0: XML简易API使用181 下载
开关处理模块
输入输出
开关器所做的是维护一组哈希表( H a s h t a b l e )形式的规则。规则集合按照元素类型索引。应用
程序可以指定一个叫做E l e m e n t H a n d l e r的类处理特定的元素类型。当解析器报告一个元素开始标
签,相应的E l e m e n t H a n d l e r 放在规则集合里并被调用以处理这个开始标签。同时,
E l e m e n t H a n d l e r在堆栈里记录,这样相同的E l e m e n t H a n d l e r可以用于处理元素的结束标签和元素
中直接出现的字符数据。
整个开关器的代码如下:
程序清单6 - 2 1
182使用XML 高级编程
下载
E l e m e n t H a n d l e r有点类似于D o c u m e n t H a n d l e r,但是它只是处理了事件的子集:元素的开始
和结尾,以及字符数据。所以尽管在这里可以使用D o c u m e n t H a n d l e r,我们仍定义了一个特定类。
这可以作为接口的定义使用,也可以作为实际元素处理器的超集使用:良好的J a v a编程实践可能
建议使用一个独立的接口类,但是现在可以这样做:
程序清单6 - 2 2
第6章SAX 1.0: XML简易API使用183 下载
到此为止,这是一个完整的通用模型。可以对各种类型的文档使用S w i t c h e r 和
E l e m e n t H a n d l e r类进行各种处理操作。现在在一个实际的应用程序中使用它们:我们想要生成一
个H T M L页面显示从书目列表选择的数据。
下面是相应的应用程序。我们将从主控制结构开始。应用程序创建了一个S w i t c h e r并注册了
几个E l e m e n t H a n d l e r类以处理在输入X M L文档中的特定元素。然后它创建一个P a r s e r,指定
S w i t c h e r为D o c u m e n t H a n d l e r,并进行解析:
程序清单6 - 2 3
实际的元素处理器可以被定义为D i s p l a y B o o k L i s t类中的一个内部类:这有助于它们共享对
数据的访问。
处理最外面的元素“ b o o k”的E l e m e n t H a n d l e r创建一个H T M L页面框架:
程序清单6 - 2 4
184使用XML 高级编程
下载
处理多个“b o o k”元素的E l e m e n t H a n d l e r开始并结束生成的H T M L表中的行,并初始化一些
变量以存放数据:
程序清单6 - 2 5
最后,处理< b o o k >元素中字段的元素处理器更新存放数据的本地变量。为了使程序结构清
晰,在这里没有考虑性能问题—使用S t r i n g B u ff e r s变量程序的性能会好于使用S t r i n g s变量。
程序清单6 - 2 6
第6章SAX 1.0: XML简易API使用185 下载
i n Vo l u m e标志用来跟踪当前元素是否包含于一个< v o l u m e >包容元素中,在这种情况下,它
是可以忽略的。一旦把所有的代码汇合在一起(完整的代码可以在h t p : / / w w w. w r o x . c o m找到),
可以用下面的命令运行程序处理一个X M L实例文件:
输出将如下所示:
程序清单6 - 2 7
186使用XML 高级编程
下载
可以按你所需加工细化该设计模式。可以在以下方面进行优化提高:
• 允许元素处理器访问包含它们上下文细节信息的堆栈。
• 根据条件而不仅仅根据元素名称选择元素处理器。
• 通过允许元素处理器把事件传送给另一个D o c u m e n t H a n d l e r,把事件处理器当作管道的一
部分使用。
该设计模式的优点是避免了许多i f - t h e n - e l s e程序语句。在每引入一个新的元素类型时,它不
需要更改D o c u m e n t H a n d l e r以添加条件逻辑。取而代之的是只需注册另外一个元素处理器。
6.5 SAX 2.0
SAX 1.0已经被非常普遍地实现,并且几乎从1 9 9 8年1月1 2日第一个草稿发布那天起,即比
XML 1.0的最终建议稿早一个月,它已经被广泛地使用。它很好地满足了用户的需求,尽管也有
一些批评意见,其中有些在本章提到了。
所以后续版本SAX 2.0的开发就是自然而然的了,它的开发相对来说不是那么紧迫。在1 9 9 9
年的前几个月, X M L - D E V邮件列表讨论了有关的需求情况,而且David Megginson在1 9 9 9年6月1
日发布修改规范的测试版本(尽管没有广为宣传通告)。基本上取得了一致意见,看起来SAX 2.0
的最终规范接近于它现在的形式,可以在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 2 /站点找到。
该规范是否能被广泛地支持是另一个问题。时间会证明一切。
对原S A X接口的扩展方法本身是很有意思的。已经定义了一个标准机制,允许应用程序要
求解析器支持特定的特性或设置特定的属性;解析器在任何情况下都可以拒绝该要求。特性和
属性的集合特性和属性可以在任何时候被任何人提交产生。为了达到这一点,特性和属性是用
U R L来标识,很类似于X M L命名空间的标识方式。
6.5.1 可配置的接口
S A X 2中主要的新接口是C o n f i g u r a b l e接口。一个S A X 2解析器必须像实现o rg . x m l . s a x . P a r s e r
接口一样实现o rg . x m l . s a x . C o n f i g u r a b l e。C o n f i g u r a b l e接口包含四个方法(参见表6 - 4)。
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML高级编程上(67)