• 热门标签

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

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

文件。
3. 管道的终点:生成X M L
如前例所示,经常管道最终的输出会是一个新的X M L 文档。所以常常需要一个
D o c u m e n t H a n d l e r,使用来自管道的事件流生成X M L文档:一种反向的解析。
奇怪的是不能在We b上找到实现这种功能的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章SAX 1.0: XML简易API使用175 下载
J a v a比较少用到的处理字符串和数组的方法:
程序清单6 - 2 0
176使用XML 高级编程
下载
第6章SAX 1.0: XML简易API使用177 下载
178使用XML 高级编程
下载
现在可以看到S A X是如何像读取X M L文档一样编写X M L文档。实际上,可以接连运行S A X:
代替P a r s e r这种由其他人编写的标准软件,而D o c u m e n t H a n d l e r是特定的应用代码,可以编写
o rg . x m l . s a x . P a r s e r的实现,其中包含你生成X M L的应用逻辑,使其和非标准的D o c u m e n t H a n d l e r
第6章SAX 1.0: XML简易API使用179 下载
配合编写X M L文档输出。
4. 其他P a r s e r F i l t e r
下面是一些其他有用的P a r s e r F i l t e r。
(1) NamespaceFilter
该P a r s e r F i l t e r实现在第7章中描述的XML 命名空间建议稿。可以从John Cowan 的
h t t p : / / w w w. c c i l . o rg / ~ c o w a n / X M L /站点获取此建议稿。
S A X在XML 命名空间建议稿发布之前就定义了,因此没有考虑到命名空间。如果一个元素
名在源文档里以< h t m l : t a b l e > 形式书写,那么传递给s t a r t D o c u m e n t ( )方法的元素名将是
“h t m l : t a b l e”。应用程序很难确定“ h t m l”引用的是哪个命名空间。
N a m e s p a c e F i l t e r解决了这个问题。N a m e s p a c e F i l t e r跟踪文档中所有的命名空间的声明(即
“x m l n s : x x x”属性),当带前缀的元素或属性名称被S A X解析器通告,N a m e s p a c e F i l t e r在把它沿
管道继续传递之前,用整个命名空间U R L代替元素前缀。例如,如果元素开始标签是< h t m l : t a b l e
x m l n s : h t m l =“h t t p : / / w w w. w 3 . o rg / T R / R E C - h t m l 4 0 >”,那么传递给下一个D o c u m e n t H a n d l e r的元素
名将是“h t t p : / / w w w. w 3 . o rg / T R / R E C - h t m l 4 0 ^ t a b l e”。“^”用来把命名空间U R L和元素的本地部
分分开,因为" ^ "不能出现在U R L或X M L名中。
有时应用程序不仅需要知道命名空间U R L,同样也希望知道前缀信息(例如,用在错误消
息中)。N a m e s p a c e F i l t e r不提供此类信息,但是它很容易扩展以提供此类信息。
(2) InheritanceFilter
InheritanceFilter 也可以从John Cowan的站点h t t p : / / w w w. c c i l . o rg / ~ c o w a n / X M L /获取。
很多X M L文档设计使用可继承属性的概念。这种思想是如果元素的特定属性没有出现,则
其值从其包容元素的同一属性中获取。X M L标准本身采用了这种思想,对特殊的属性x m l : l a n g
和x m l : s p a c e,这种思想在一些其他标准如X S L格式化对象建议中也被采用。
I n h e r i t a n c e F i l t e r是一个P a r s e r F i l t e r,它通过包含那些元素中没有真正出现但是从父元素中
继承的属性,扩展了属性列表。扩展了的属性列表传递给s t a r t E l e m e n t ( )方法进行处理。
I n h e r i t a n c e F i l t e r需要用被作为继承属性处理的属性名列表进行修剪。
(3) XLinkFilter
X L i n k F i l t e r提供对X L i n k规范草稿关于在X M L文档间创建超链接的支持。Simon St.Laurent
在h t t p : / / w w w. s i m o n s t l . c o m / p r o j e c t s / x l i n k f i l t e r /站点发布了X L i n k F i l t e r。
不像大多数的P a r s e r F i l t e r,X L i n k F i l t e r不加改变地传递所有的事件。然而在此之中,
X L i n k F i l t e r创建了一个数据结构以反映文档中遇到的XLink 属性。在管道的后续步骤中可以查询
该数据结构。
X L i n k规范中定义的一种链接是所谓的“包含”链接,链接文本被设计用于在主文档中按行
显示—很像C中的预处理# i n c l u d e命令。相应的X L i n k语法是s h o w =“p a r s e d”。这很类似于一个
外部实体参照,除了应用程序可以控制决策是否和何时包含链接文本:例如,用户可能在显示
文档的长短形式上做选择。当然,可以实现一个直接扩展这种链接的筛选器,提交包含文档给
管道的后续步骤,就像包含文档是物理地嵌入到源文档中一样。
(4) 共享上下文的管道
180使用XML 高级编程
下载
有关管道的一个潜在的问题是其中的每个筛选器必须自己处理其他筛选器已经识别的东
西;一个常见的例子是当前元素的父元素。如果一个筛选器已经维持了一个确定此类信息的元
素堆栈,那么其他的筛选器重复同样的工作是一种浪费。
可以通过允许筛选器访问以前筛选器创建的数据结构,或者直接通过公共方法,解决这个
问题。但是这需要管道中的筛选器彼此之间了解比单纯管道模型更多的信息,这降低了任意组
装筛选器的可能性。可以论证,当处理达到这种复杂程度时,最好完全不使用基于事件的处理
方法,而是使用D O M(采用导向性设计模式)。
5. 基于规则的设计模式
创建S A X应用程序的另一种方式是基于规则的方法,它的目标也是功能分割,结构模块化
和简单化。
一般情况下,基于规则的程序使用一种“事件-条件-操作”的模型:程序包含形如“如果事
件在此条件下发生,则执行操作”的规则集合。基于规则编程因此可以被看作是基于事件编程
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程上(66)