IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  XML  >

技巧: 使用 SAX 实现供应商无关性

如何使用 SAX 和 SAX helper 类实现供应商无关性

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Brett McLaughlin (brett@newInstance.com), Enhydra 策略顾问, Lutris Technologies

2001 年 3 月 01 日

当 XML 开发新手学习通过 JAXP 来达到供应商无关性时,SAX 老手已经在几年前就实现了与供应商的独立。本文说明了如何在基于 SAX 的应用程序中使用 SAX 和 SAX helper 类实现供应商无关性。

随着人们最近以来对 JAXP(用于 XML 分析的 Java API,可从 参考资料 部分中了解详细信息)兴趣的高涨,以及 JAXP 资源的大量涌现,您也许已经忘了存在很久的 SAX、DOM 和 JDOM。实际上,许多开发人员(可能甚至包括您)使用的都是 SAX、DOM 和 JDOM,他们甚至还没有接触过 JAXP。

虽然 JDOM 拥有一种著名的处理各种语法分析器的标准方法,而且DOM 在版本3之前根本没有这种功能,但是对于许多开发人员来说,SAX 仍显得有点神秘。许多程序员编写的 SAX 既不能移植也不独立于供应商。其结果就是他们的应用程序受困于某个特定的语法分析器 -- 有时甚至是某个语法分析器的特定版本。在本文中,我将说明如何使用 SAX helper 类使您的工作变得更轻松,使您的代码摆脱与某个特定供应商类的相关性。

所有 SAX 编程的基础是 SAXParser 实现的实例。使用 SAX 分析 XML 的最常用方法就是实例化供应商提供的实现类。 清单 1 显示了这种方法的使用。

当然,清单 1 中存在的问题是,为了更改语法分析器,必须更改实现类。而且这可能意味着要添加或除去 import 语句,而且……您可以想像得到。突然之间,您要将午茶时间花费在修改代码和重新编译上,而不是用来喝咖啡。退一步说,可能由此导致许多问题。然而,从一种 SAX 语法分析器更改成另一种语法分析器不应该如此折磨人。SAX 为开发人员提供了更好的选择。可惜,许多程序员都错失了这个机会。

为使更换语法分析器变得更简单,请考虑使用 org.xml.sax.helpers.XMLReaderFactory helper 类。这个类提供了一种方便的方式,它选取一个类名,然后生成所提供的类的实例。如果您拥有使用 Java 的丰富经验,就会认识到这种方式类似于 Class.forName(String className).newInstance() 。因此,您应该按照 清单 2 中显示那样来编码,而不是使用“清单 1”中显示的代码。

在清单 2 中,更改语法分析器实现只涉及更改一个类名。而且那是非常安全的更改,因为它只要修改 String 值。这比 清单 1 中混乱的导入和代码更改更好,您说呢?有一个缺点是:在更改语法分析器时,仍必须对代码做一些更改。这一点并不完美。因此,您也许应该使用 Java 系统特性来处理要装入的类,而不是在此字符串中进行硬编码。这将允许通过命令行变量(使用 Java -D 自变量)或简单的 Java 特性文件来对应用程序指定语法分析器类。而且,似乎 SAX 还不够容易, XMLReaderFactory 类“专门”提供了这个功能。如果没有对 createXMLReader() 方法指定自变量,那么该方法会寻找作为系统特性 org.xml.sax.driver 的值指定的类。您甚至不必亲自执行任何操作!因而 清单 2中的代码被修改成 清单 3中的代码。

现在,如果使用“清单 3”中的方法,那么 SAX 代码甚至不必进行重新编译就能运行,并根据需要使用不同的语法分析器实现。当然,如果使用的是 JAXP,就不需要这种方法。但如果您是 SAX 的坚决拥护者,那么本提示有助于您更有效地编写可移植性更佳的代码。如果使用的是 JAXP,也许应该参考我写的有关该主题的文章(请参阅 参考资料)。继续编写代码吧,但要聪明一点!



参考资料



关于作者

Brett McLaughlin ( brett@newInstance.com) 是 Lutris Technologies 的 Enhydra 策略顾问和分布式系统体系结构方面的专家。他是 Java 和 XML (O'Reilly) 的作者。他还参加了,如 Java servlets、Enterprise JavaBeans 技术、XML 和商家对商家应用等技术的研究。他与 Jason Hunter 一起建立了 JDOM 项目,该项目为在 JAVA 应用程序中控制 XML 提供一个简单的 API。他还是 Apache Cocoon 项目和 EJBoss EJB 服务器的活跃开发人员以及 Apache Turbine 项目的共同创建者。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款