• 热门标签

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

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

例外。
• 也可以在应用程序中创建已知解析器的列表,然后试着轮流加载它们直至找到一个可以成
功加载的解析器。这样就允许你的用户安装类路径上的任何一个解析器,当然不允许使用
170使用XML 高级编程
下载
一个你所不知道的解析器。
第二种技术的一个例子可以在P a r s e r M a n a g e r类中找到,该类可以从Michael Kay的S A X O N
包得到(参见h t t p : / / u s e r s . i c l w a y. c o . u k / m h k a y / s a x o n /)。该类根据一个叫P a r s e r M a n a g e r. p r o p e r t i e s
(S A X O N包提供)的配置文件里的信息初始化一个解析器。为了用一个不同的解析器运行应用
程序,只需简单编辑配置文件(文件中写明了指令)。P a r s e r M a n a g e r是可以不依赖于S A X O N包
中其他组件使用的独立类,而且是自由发布的。一旦安装了P a r s e r M a n a g e r,并且在类路径中包
含属性文件,你就可以创建一个SAX Parser,只需写:
将会在后面的例子中实现这一操作。
6.4 一些SAX设计模式
上述S A X应用程序实例仅关注于处理一两个不同的元素,而且这种处理是很简单的。在实
际的应用程序中,需要处理很多个不同的元素类型,这样程序的风格将会迅速地变得非常不结
构化了。主要有两个原因:第一,处理相同全局上下文数据的不同事件的交互操作是很难解决
的;第二,每个事件处理方法都需要做一些完全独立的操作。
所以为了避免这种情况,需要仔细考虑S A X应用程序的设计。本节提供了一些可能的方法。
下面看看以下两种常用的模式:筛选模式和基于规则模式。
筛选设计模式
筛选设计模式,有时也称为管道模式,其中处理过程的每一步都可以表示为管道的一段:
数据流经管道,每段管道筛选流经过的数据。如图6 - 2所示。
图6-2
一个筛选器可以做许多不同的事情,例如:
• 除去源文档中不需要的元素。
• 修改标签或属性名。
• 进行确认验证。
• 规格化数据值(如日期)。
筛选模式的重要特性就是每个筛选器都有输入和输出,它们遵循相同的接口。筛选器一端
实现了接口,另一端作为同一个接口的客户端。所以任何相邻的筛选器对,左边的相当于解析
器P a r s e r,右边的相当于文档处理器D o c u m e n t H a n d l e r。实际上,这种结构中的筛选器一般同时
第6章SAX 1.0: XML简易API使用171 下载
过滤器1 过滤器2 过滤器3
输入输出
实现S A X的P a r s e r和D o c u m e n t H a n d l e r接口。(在这里说“ P a r s e r”,当然可能不太恰当。S A X
P a r s e r的特性不是它可以理解X M L的文法和语法规则,而是它告知文档处理器发生的事件。任何
发出这种通知的程序都可以实现SAX Parser接口,即使它可能不做任何实际的解析操作。)
筛选器也可能有多个输出,通知多个接收者发生的事件;相对少见的情况是筛选器有多个
输入,从多个数据源汇合事件。
筛选器设计模式的优势是筛选器可以被高度复用,因为就像实际的管道装置一样,相同标
准的筛选器可以以很多不同的方式组装到一起。
1. ParserFilter类
有很多工具可以用来创建上述形式的管道。最简单的是John Cowan的P a r s e r F i l t e r类,可以
从h t t p : / / w w w. c c i l . o rg / ~ c o w a n / X M L /获取。这是一个抽象类:定义了所有筛选器需要的操作,而
且允许你为自己管道中每个特定的筛选器定义子类。
正像你所期望的,P a r s e r F i l t e r同时实现了SAX Parser和D o c u m e n t H a n d l e r接口;实际上,它也额外
地实现了其他S A X事件处理接口(D T D H a n d l e r,E r r o r H a n d l e r和E n t i t y R e s o l v e r)。该类中的所有事件处
理方法所做的就是把事件传送给管道中的下一个筛选器;定义的子类可以忽略任何需要加工的方法。
P a r s e r F i l t e r类有一个构造器可以把P a r s e r作为它的参数:结果是创建一段管道并且连接它到
其左边的另一段管道。为创建上图里的三段管道,可以编写下列代码:
程序清单6 - 1 6
管道的初始化输入当然是一个SAX Parser,而最终输出是一个SAX DocumentHandler。
2. ParserFilter实例:一个缩进器
下面是一个完全实现P a r s e r F i l t e r的实例I n d e n t e r。该筛选器接收S A X事件流,通过在开始和
结束标签前添加空白格消息化数据,以使文档的嵌套结构可视化。然后传递消息化的数据给下
一个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:
程序清单6 - 1 7
172使用XML 高级编程
下载
第6章SAX 1.0: XML简易API使用173 下载
174使用XML 高级编程
下载
为了实际运行这个实例,需要一个输出X M L文档的D o c u m e n t H a n d l e r;假设存在一个叫做
X M L O u t p u t t e r的文档处理器(下一节里将展示X M L O u t p u t t e r是如何编写的)。然后可以编写如
下的主程序:
程序清单6 - 1 8
还必须在文件的首部添加对P a r s e r M a n a g e r类的导入声明:
程序清单6 - 1 9
为使程序更加实用可行,通过把输入文件作为一个可以在命令行指定的参数(从a rg s [ 0 ]获
取),并且通过使用前面介绍的P a r s e r M a n a g e r类创建下面的SAX Parser。它仍然不是一个生产性
程序,例如如果没有输入参数,它就会调用失败,但是已经接近一个实用的生产性程序了。一
旦设置了类路径(记住使用了P a r s e r M a n a g e r,P a r s e r M a n a g e r. p r o p e r t i e s文件必须也包含在类路径
中),就从命令行运行程序,如:
可以看到输出排版整齐地缩进。因为参数是一个U R L,所以可以格式化任何We b上的X M L
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程上(65)