Board logo

标题: 利用 DOM 进行自举的基础知识(1) [打印本页]

作者: look_w    时间: 2018-7-11 08:46     标题: 利用 DOM 进行自举的基础知识(1)

使用文档对象模型(或称 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 接口的供应商实现。大多数开发人员都倾向于编写下面这行代码来获取该实现的实例:      
1
Document doc = new org.apache.xerces.dom.DocumentImpl();




如果您使用了该代码,可能会有几个问题:
除了这行代码是特定于供应商的之外,您还必须执行其它特定于供应商的步骤以获取         org.w3c.dom.DocumentType 接口的实现。      
更佳的方法是使用         org.w3c.dom.DOMImplementation 类,这个类充当上述两个接口的工厂。无须直接获取 DOM         Document 实现,可编写如下代码:      
1
2
3
4
5
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 结构:         DocumentType 和         Document 接口。这省去了我前面谈论的所有额外的特定于供应商的步骤;当然,您仍然使用对 Xerces 特定的         DOMImplementation 实现类的引用,所以并非一切都很完美。就象前面提及的,只为了换一种解析器您就必须重新编译所有代码,而这并不是一个可行的解决方案。      
改正这个问题需要大量更多的工作,我将在本系列的下一篇技巧文章中介绍这一工作。目前,首先请务必理解自举的基本概念,并且理解为什么这是一个问题。在下一篇技巧文章中,我将向您演示如何在代码中避免特别引用 DOM 实现的要求,您还将亲自进行一些编程来处理这个问题。到时网上见!




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0