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

XML高级编程上(64)

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin 点击:
  
• 当使用多版本系统,同一实体具有多个版本,以及决定在给定情形使用哪个版本的规则。
• 当存在一系列标准实体的许多副本,而且系统考虑性能因素,想找到最近的副本。
• 当实体被公共标识符而不是U R L引用时。公共标识在S G M L领域越来越流行而且许多出
版商也希望能够继续通过X M L使用它们。在S G M L中,公共标识符一般通过被称为目录的
查找表映射到实际文件。X M L中没有定义这样的机制,但是S A X允许应用程序使用这种
机制。
当外部实体不能仅仅通过U R L 被找到, S A X 应用程序应该提供一个实体分解器
(E n t i t y R e s o l v e r):即一个实现o rg . x m l . s a x . E n t i t y R e s o l v e r接口的类。应用程序可以通过调用解析
器的s e t E n t i t y R e s o l v e r ( )方法来为解析器注册实体分解器。
实体分解器只需要实现一个方法: resolveEntity( )。它被解析器通过两个参数调用:系统标
识符(即U R L)和公共标识符。如果在实体声明中没有指定公共标识符,公共标识符设为空值。
resolveEntity( )方法的任务是返回一个I n p u t S o u r c e对象,解析器将使用这个对象读取外部实体的
内容。
在附录C SAX规范中有一个实体分解器的简单实例。
非解析实体与注释
S A X一般来说不会提供给应用程序任何关于D T D内容的信息。在S A X定义过程中,人们认
为绝大多数应用程序都不需要这类信息,因此它被搁置了。(我们将看到S A X 2 . 0在这方面扩展一
些可用功能。)
然而,完全禁止对D T D内容的访问将使S A X应用程序不能处理一些文档,这些文档包含对
非解析实体与注释的引用。果真这样的话,有一些很少使用但不能断言如此的X M L特性,它们
仍然为一些人所拥戴。非解析实体允许一个X M L文档包含对非X M L对象如二进制图像或声音的
引用;非解析注释可以注册和准确识别这些对象的格式。当遇到一个非解析实体时,解析器
(按照定义)不会做任何处理,而由应用程序进行解释。但是应用程序只有在能够识别外部实体
和注释时才能处理它,因此它需要访问D T D中的有关声明。
因此S A X接口D T D H a n d l e r实际上只提供关于非解析实体与注释很少而且非常特殊的信息,
尽管其名字暗示它可以提供对D T D中各种感兴趣对象的访问。如果需要这些信息,你可以像使
用其他事件处理接口一样使用D T D H a n d l e r:编写一个实现o rg . x m l . s a x . D T D H a n d l e r的类,并使
用DTDHandler( )方法为解析器注册它。随后解析器会告知D T D对非解析实体和注释的声明中使
用的系统标识符和公共标识符,然后当在文档主体中遇到对这些对象(以E N T I T Y,E N T I T I E S
和N O TAT I O N类型属性的形式)的引用时可以使用这些信息。
但是不要介意D T D H a n d l e r只提供了比其名字所许诺的少的信息!
6.3.3 选择解析器
就这个标题,可以分别考虑两个问题:
第6章SAX 1.0: XML简易API使用169 下载
• 作为设计者,如何决定使用哪个产品?
• 作为程序员,如何把应用程序配置成可以在运行时选择解析器?
第一个问题实际上超出了本书的范围。我们已经列出了一些可用的S A X解析器,凭心而论,
它们之间的差别很小。它们都是免费的,尽管彼此的许可条件书不同:可以尝试所有产品然后
选择你喜欢的。
解析器一般分为两类,由个人开发的和由组织机构开发的。这两类产品一样可靠。由组织
机构开发的解析器可能有更好的文档资料和支持,它们也会包括许多辅助特性(如支持中文字
符编码或有C O B O L / C I C S接口模块)。如果你恰好需要这些特性,那么它们是很好的选择;如果
不需要,它们将浪费硬盘空间和下载时间。
如果想要一个只进行S A X解析的解析器,对其他如速度、可靠性和与标准一致性等都不关
心,而且你不需要技术支持,那么还有几个比从h t t p : / / w w w.jclark.com/xp 获取的James Clark的
x p解析器更好的产品。AEl f r e d(h t t p : / / w w w. m i c r o s t a r. c o m / a e l f r e d . h t m l)是一个小巧的解析器,
可以选择它嵌入到自己的应用程序中,特别是当下载时间有重要影响作用的a p p l e t中。S u n和
I B M的解析器可以对不正确的X M L文件生成更有帮助的诊断信息,所以它们在X M L编辑环境中
比较有用。对于其他解析器,主要考虑它们的运行环境:例如O r a c l e解析器在大量用到O r a c l e产
品的应用程序中是显而易见的选择。
实际上保留可选择性是一个不错的主意:你不知道解析器将来会怎么样,而且也不知道应
用程序的潜在购买者是否也有如“拒绝无支持的软件”或“拒绝没有法语错误消息的软件”的
策略。这就意味着你希望避免用决定性陈述的方式编写应用程序,这把你和你的客户限定于某
个特定的产品。例如:
如果是在一个如C O R B A(通用对象请求代理体系结构—参看h t t p : / / w w w. o m g . o rg)的分布
式对象环境中运行,这种问题正确的结构方法是应用程序授权Tr a d e r完成寻找解析器的任务,
Tr a d e r可以使用各种规则以发现满足运行要求的解析器。可以理解S A X的设计者希望避免依赖于
这样一个运行时环境,而是给你一些选择:
• 可以使用S A X 发行版包含的简单帮助类P a r s e r F a c t o r y 。应用程序调用静态方法
P a r s e r F a c t o r y.makeParser( )。它通过读取o rg . x m l . s a x . p a r s e r的系统属性并将其作为一个类
名解释。可以通过使用J a v a命令行的- D选项设置系统属性,因此可以编写一个命令行脚本
从环境变量中设置系统属性。
• 可以实现自己的P a r s e r类初始化机制,类名在运行时确定。可以在一个配置文件或
Wi n d o w s注册表中保留类名。假设可以把名字当作字符串读取,你就可以使用如下的J a v a
语句创建一个Parser 实例。实际应用中,你需要添加一些错误处理以捕获可能产生的各种
 
中国航空网 www.aero.cn
民航翻译 www.aviation.cn
本文链接地址:XML高级编程上(64)
 
------分隔线----------------------------