级别: 初级 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,也许应该参考我写的有关该主题的文章(请参阅
参考资料)。继续编写代码吧,但要聪明一点!
参考资料
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 请阅读 Brett McLaughlin 撰写的关于 JAXP 的文章:
JAXP 1.0和更新且更实用的
JAXP 1.1
- 请访问
SAX 主页
- 请阅读
JAXP规范 (PDF)
- 请关注
developerWorks XML 专区中的其它最新提示:
关于作者  | |  | 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 项目的共同创建者。
|
对本文的评价
|