级别: 初级 Brett McLaughlin (brett@oreilly.com), 作家兼编辑, O'Reilly and Associates
2002 年 12 月 01 日 这篇技巧文章说明了 DOM 级别 3 中有关自举方面的更改,以及它们是如何改进 DOM 级别 1 和级别 2 的。
在上两篇技巧文章中,我向您展示了在 DOM 级别 1 和级别 2 下进行自举需要了解的几乎所有内容。除了自举中所涉及到的基本概念之外,您还应该知道使用
DOMImplementation 类的原因以及 DOM 级别 1 和 2 如何容易地将您与特定供应商的 DOM 实现联系起来。而且,在
上一篇技巧文章 中,我向您展示了一个简单的实用程序类可以如何使处理解析器的更改更容易。
虽然所有这些都很好,但仍需要花费许多精力(或者至少需要在 google.com 上进行一番搜索)来进行工作,而这些事情应该可以简单些。难道
DOM 规范就不能解决这些自举方面难题呢?好的,我很高兴地告诉您,在 DOM 级别 3 中,以一种改进的、与供应商无关的方式对自举进行了最终的检查和重写。
注 :在做进一步讨论之前,我想强调 DOM 级别 3 处于即将发布的状态,您还很难找到完全支持 DOM 级别 3
的解析器。也就是说,它处于即将发布状态,一旦它最终完成,就可以利用它的所有新特性,包括这里所讨论的自举。
DOM 级别 3 引入了新的自举方式,用该方式可以避免恼人的特定于供应商的问题,在 DOM
前两个级别中会碰到这种问题。另外,还不需要如上一篇技巧文章所设计的助手类。通过引入新的 DOM 类
org.w3c.dom.DOMImplementationRegistry ,使得用与供应商无关的方式来获得 DOM 实现成为可能。
首先,您(或者您的解析器供应商)需要设置系统特性
org.w3c.dom.DOMImplementationSourceList 。该特性值应该是以空格隔开的类名列表,这些类实现了
org.w3c.dom.DOMImplementationSource 接口。这是 DOM 实现解析器的关键机制。例如,清单 1
显示了 Apache Xerces 解析器可能会如何实现该接口。
清单 1. 样本 Xerces DOMImplementationSource
package org.apache.xerces.dom;
import org.w3c.dom.DOMImplementationSource;
public class XercesDOMImplementationSource implements DOMImplementationSource {
public DOMImplementation getDOMImplementation(String features) {
return new DOMImplementationImpl();
}
}
|
注 :这不是真正的 Xerces 实现类;实际上,
getDOMImplementation()
方法需要验证 feature 字符串,确保 Xerces 实现能够满足需要,并且在返回
DOMImplementation
实现之前执行其它错误检查。
然后,可以将系统特性设置成值
org.apache.xerces.dom.XercesDOMImplementationSource 。通常,通过解析器自己的代码,或者在应用程序启动时通过批处理文件或 shell 脚本设置该特性,如清单
2 所示。
清单 2. 设置系统特性
java -Dorg.w3c.dom.DOMImplementationSourceList\
=org.apache.xerces.dom.XercesDOMImplementationSource \
some.application.class
|
适当地使用这种方法,那么就可以使用如清单 3 所示的那行代码来方便地自举 DOM 实现。
清单 3. DOM 级别 3 中的自举
DOMImplementation domImpl =
DOMImplementationRegistry.getDOMImplementation("XML 1.0");
|
这样,创建新的 DOM 树以及执行其它标准 DOM 操作就很简单。因为系统特性负责处理装入特定于解析器和供应商的细节问题,所以您的代码将摆脱特定于供应商这种传统观念。
至此您已经了解了自举― 这三篇技巧文章详细地讨论了(用多种方式而不是一种方式讨论了该问题!)DOM 自举问题。我非常高兴地告诉您,我现在将继续下去,探讨一些更有趣的编程任务。所以,到下一篇技巧文章时,我们网上见!
参考资料
关于作者  | 
|  |
Brett McLaughlin从 Logo 时代(还记得那个小三角形么?)就开始从事计算机工作了。他现在专门研究用 Java 和 Java 相关技术构建应用程序基础设施。过去几年他一直在 Nextel Communications 和 Allegiance Telecom, Inc. 致力于实现这些基础设施。Brett 是 Java Apache 项目 Turbine 的共同创始人之一,该项目用 Java servlet 为 Web 应用程序开发构建可重用的组件体系架构。他还是 EJBoss 项目(一个开放源码的 EJB 应用程序服务器)和 Cocoon(一个开放源码的 XML Web 发布引擎)的参与者。
|
对本文的评价
|