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

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

Comments

使用文档对象模型(或称 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 实现的要求,您还将亲自进行一些编程来处理这个问题。到时网上见!


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=21125
ArticleTitle=技巧:利用 DOM 进行自举的基础知识,第 1 部分
publish-date=11012002