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

developerWorks 中国  >  XML  >

技巧:利用 DOM 进行自举的基础知识,第 1 部分

使用 DOM Level 1 和 DOM Level 2 进行自举

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Brett McLaughlin (brett@oreilly.com), 作家兼编辑, O'Reilly and Associates

2002 年 11 月 01 日

本篇技巧文章是有关使用 DOM 进行自举的系列文章的第一部分,解释了什么是自举,并探讨了与之相关的一些问题,还介绍了在 DOM Level 1 和 DOM Level 2 中使用的一些基本知识。

使用文档对象模型(或称 DOM)最令人误解和误用的方面之一,就是有关获取用于编程的初始 DOM 实现方面的问题。这通常称为自举(bootstrap),我常常看到它被错误的执行。当然,由于只有当您手边确实有了 DOM 实现时您才能使用 DOM 进行工作,所以这会给您所有的程序带来困难。如果您没有碰到这个问题,接着就会产生“先有鸡还是先有蛋”这个经典例子。如果没有起始点,您就不能用 DOM 做任何工作;但是,起始点本身又是一个 DOM 类。因此,您需要 DOM 类以便开始使用 DOM,但是要获得 DOM 类您又需要使用 DOM……够混乱的,不是吗?我将在以后几篇技巧文章中帮助澄清整个问题。

:我知道,如果您正在使用 JAXP(Sun 的“用于 XML 处理的 Java API”,Java API for XML Processing),那么,不用执行本技巧文章所概括的那些步骤就可能得到 DOM 实现。但是,您不可能手边始终都有 JAXP 实现,而且作为一名优秀的 DOM 程序员,您应当知道在不使用 JAXP 时究竟该如何工作!因此,即使可以使用 JAXP,本篇技巧文章对您而言仍然是有用的。

在 DOM Level 1 和 DOM Level 2 中,您用来使 DOM 实现起作用的过程有些困难。在下一篇技巧文章中,我将讨论纠正所有这些问题的方法。首先,您应当理解为什么需要 DOM 实现,以及如何 进行自举,本篇技巧文章讲述了这两方面的内容。

如果您正在读入 XML 文档,例如从现有文件或输入流,那么这篇文章不适用于该情形。在这些情形下, reader.getDocument() 方法会返回 DOM Document 对象,然后您可对该 DOM 树操作,这不会有任何问题。但是,DOM 同样有用,因为它允许您使用 DOM 树创建新的 XML 结构,然后将该结构序列化到一个文件或其它输出接收器。在这些情形下,供应商特定性就成为一个问题。

自举的最终目的是为了获得 org.w3c.dom.Document 接口的供应商实现。大多数开发人员都倾向于编写下面这行代码来获取该实现的实例:

Document doc = new org.apache.xerces.dom.DocumentImpl();

如果您使用了该代码,可能会有几个问题:

  • 您的代码现在与 Apache Xerces 结合在一起,因此无法轻易使它与另一个解析器一起工作。
  • 甚至对于您正在使用的解析器的另一个版本,该代码也经常会不起作用。
  • 最重要的是,这不是使用 DOM 创建机制的正确方法!

除了这行代码是特定于供应商的之外,您还必须执行其它特定于供应商的步骤以获取 org.w3c.dom.DocumentType 接口的实现。

更佳的方法是使用 org.w3c.dom.DOMImplementation 类,这个类充当上述两个接口的工厂。无须直接获取 DOM Document 实现,可编写如下代码:

DOMImplementation domImpl =
    new org.apache.xerces.dom.DOMImplementationImpl();
DocumentType docType = 
    domImpl.createDocumentType("rootElementName", "public ID", "system ID");
Document doc = domImpl.createDocument("", "rootElementName", docType);

现在,您已经可以使用 DOMImplementation 对象。有了这个对象,您就可以生成用来构建树的两类 DOM 结构: DocumentTypeDocument 接口。这省去了我前面谈论的所有额外的特定于供应商的步骤;当然,您仍然使用对 Xerces 特定的 DOMImplementation 实现类的引用,所以并非一切都很完美。就象前面提及的,只为了换一种解析器您就必须重新编译所有代码,而这并不是一个可行的解决方案。

改正这个问题需要大量更多的工作,我将在本系列的下一篇技巧文章中介绍这一工作。目前,首先请务必理解自举的基本概念,并且理解为什么这是一个问题。在下一篇技巧文章中,我将向您演示如何在代码中避免特别引用 DOM 实现的要求,您还将亲自进行一些编程来处理这个问题。到时网上见!



参考资料



关于作者

Brett McLaughlin 的照片

Brett McLaughlin自从 Logo 时代(还记得小三角形吗?)开始就一直从事计算机方面的工作。目前,他专门从事用 Java 语言和与 Java 相关的技术构建应用程序基础结构。最近几年,他在 Nextel Communications 和 Allegiance Telecom, Inc. 从事这些基础结构的实现。Brett 是 Java Apache Turbine 项目的共同创始人之一,该项目通过使用 Java servlet 为 Web 应用程序开发构建可重用的组件体系结构。他还是 EJBoss 项目(一种开放源码 EJB 应用程序服务器)和 Cocoon(一种开放源码 XML Web 发布引擎)的志愿开发人员之一。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


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