支持HW团队,就支付宝领取下面的红包吧! (打开支付宝就能领取!er1OEj73Uj), (打开支付宝收索“516503473”), 你领取消费,HW有奖励。红包使用无条件限制,有条件请注意是不是有病毒。

Login or Sign up | Validate
| Search
HelloWorld论坛 : > 计算机科学、技术、教学> 编程入门> java jsp 入门> [转]技巧:利用 DOM 进行自举的基础知识
 
 
 
 
类别:c++ 阅读:6740 评论:0 时间:March 19, 2012, 5:09 a.m. 关键字:

 

 这是我在学习 Xerces xml操作是查找DOMImplementation的用法的时候找到的文章,文章发表在developerWorks 中国 这是我在学习,转载给大家一起学习 

来源:http://www.ibm.com/developerworks/cn/xml/tips/x-tipboot1/index.html

 

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

 
 

级别: 初级

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 结构: DocumentType 和 Document 接口。这省去了我前面谈论的所有额外的特定于供应商的步骤;当然,您仍然使用对 Xerces 特定的 DOMImplementation 实现类的引用,所以并非一切都很完美。就象前面提及的,只为了换一种解析器您就必须重新编译所有代码,而这并不是一个可行的解决方案。

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



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文
     
  • 请在 W2C.org 上阅读 DOM API。 


     
  • 关注一下 IBM 的 XML 新闻组: Newbies和 Java Tools。 


     
  • 在 Nicholas Chase 的教程“ Understanding DOM”( developerWorks,2001 年 8 月)中了解 DOM 文档的结构,并了解如何使用 Java 技术从 XML 文件创建文档、对其进行更改及检索输出。 


     
  • 在 developerWorks XML 专区上查找更多 XML 参考资料。 
     
  • 了解一下 IBM WebSphere Studio Application Developer,这是一个易于使用的集成开发环境,用来构建、测试和部署 J2EE 应用程序,包括从 DTD 和模式生成 XML 文档。 
     
  • 了解如何成为一名 XML 及其相关技术的 IBM 认证开发人员。 
     
  • 需要我们每周为您发送与此类似的有用的 XML 技巧文章吗?请注册以订阅 developerWorks XML 技巧时事通讯。 

来源:http://www.ibm.com/developerworks/cn/xml/tips/x-tipboot2/index.html

 

改进 DOM 级别 1 和 2 自举

 

级别: 初级

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

2002 年 12 月 01 日

在这篇技巧文章里,您将学到一种在 DOM 应用程序中进行自举的更好方法。本文以前一篇技巧文章为基础,那篇文章讨论了 DOM 本身能为自举任务做些什么。

在 前一篇技巧文章 中,我解释了 DOM 自举的基础知识,并特别解释了使用 DOM 级别 1 或 2 时这些基础知识将如何付诸实现。您学会了如何获取 DOMImplementation 类的供应商实现,以及如何用它来生成 Document 和 DocumentType 对象。而且,最为重要的是,您了解了 DOM 提供的自举功能带来的各种问题。

作为一个简短的温习,在讨论这些问题的解决方案之前,我将概述这些问题:

  1. 产生了对特定解析器的依赖性
  2. 在许多情况下,产生了对特定解析器的特定 版本的依赖性
  3. 对 DOM 实现或解析器的更改需要进行代码级更改和重编译
  4. 对 DOM 实现的更改需要更改 CLASSPATH

在以上各个问题中,只有一个问题在生产环境中是确实可接受的 ― 也就是最后一个问题, 4,对应用程序的 CLASSPATH 的更改。其它三个限制都非常严重,它们会对您能否获得可重用的(有时是可重新销售的)应用程序造成影响。

如果您回忆以下,您就会想起前一篇技巧文章是以清单 1 中所显示的代码片段作为结束的。


清单 1. XMLReader 的解析入口点


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

虽然这并不是一个差劲的自举解决方案,但它也并不特别优秀。我们不使用这种方法,也不接受它的限制,让我们来看一种更好的解决方案。在理想情况下,您需要能够从自举过程中除去所有特定于供应商的代码,并在应用程序外指定那个信息。

在理想情况下,您可以在代码中或在应用程序启动时设置系统特性(通过 java 过程的 -D 标志);我更愿意用 org.w3c.dom.DOMImplementationClass 作为该特性的名称。该特性的值是一个实现类,代码需要这一实现类来实例化 DOMImplementation 实例。在示例中,我一直使用 Apache Xerces,因此该特性的值为 org.apache.xerces.dom.DOMImplementationImpl 。

一旦您适当地掌握了这一基本思想,那么编写一个助手类就相当简单了,该助手类负责读入并实例化上述特性,然后将新对象返回给使 DOM 实例启动和运行所需的代码。清单 2 显示了这样一个助手类。


清单 2. 样本助手类


package com.ibm.xml;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.DOMImplementation;
public class DOMFactory {
    /** System property name */
    private static final String IMPL_PROPERTY_NAME =
        "org.w3c.dom.DOMImplementationClass";
    /** Initialization flag */
    private static boolean initialized = false;
    /** The DOMImplementation to use */
    private static DOMImplementation domImpl;
    private static void initialize() throws Exception {
        domImpl = 
            (DOMImplementation)Class.forName(
                System.getProperty(IMPL_PROPERTY_NAME)).newInstance();
        initialized = true;
    }
    public static Document newDocument(String namespaceURI, String rootQName,
                                       DocumentType docType) 
        throws Exception {
        
        if (!initialized) {
            initialize();
        }
        return domImpl.createDocument(namespaceURI, rootQName, docType); 
    }
    public static DocumentType newDocumentType(String rootQName,
                                               String publicId, String systemId)
        throws Exception {
    
        if (!initialized) {
            initialize();
        }
        return domImpl.createDocumentType(rootQName, publicId, systemId);
    }
}

上面的类实际上非常简单。该类的入口点是两个 public 方法,它们各返回两个 DOM 启动 类中的一个。这两个类是 DOMImplementation 生成的相同的两个类,因此这为您使用助手类提供了一些一致性。这两种方法都确保进行了初始化,然后生成所请求的对象。

初始化也并非那么复杂。系统特性返回一个类名(假定类名使用正确!),然后通过 Class.forName().newInstance() 机制实例化该类名。一旦上述处理完成,那么存储对象以及用它来生成对象就很容易了。

现在您得到了一种更好的自举方法!这一方法真得很简单。在您开始解析之前,只需将这个类连同所需的任何解析器 JAR 文件一起添加到您的类路径中,并且设置系统特性。甚至不用深究特定于供应商的代码,您就可以获得 DOM 类型。在 DOM 级别 3 公开发行以及更好的自举方法出现之前,它将一直助您克服困难,以顺利完成各种任务。还想了解其它知识吗?好!在下一篇技巧文章中,我将详细讨论如何设置 DOM 级别 3 以使之工作,并在自举方法的进展方面给你一个惊喜。到时候网上见!



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文
     
  • 本系列有关对 DOM 进行自举的技巧文章的 第1 部分解释了何为自举,探讨了与之相关的一些问题,还介绍了在 DOM 级别 1 和 2 中使用自举的基础知识( developerWorks,2002 年 11 月)。 第 3 部分解释了 DOM 级别 3 中有关自举的一些更改,以及对 DOM 级别 1 和 2 所做的改进( developerWorks,2002 年 12 月)。 
     
  • 请在 W3C.org 上阅读 DOM API。 
     
  • 关注 IBM XML 新闻组 Newbies和 Java Tools。 


     
  • 在 Nicholas Chase 的教程“ Understanding DOM”( developerWorks,2001 年 8 月)中了解 DOM 文档的结构,并了解如何使用 Java 技术来从 XML 文件创建文档,对其进行修改并检索输出。 


     
  • 在 developerWorks XML 专区上查找更多 XML 参考资料。 
     
  • 了解一下 IBM WebSphere Studio Application Developer,它是一个易于使用的集成开发环境,用于构建、测试和部署 J2EE 应用程序,包括从 DTD 和模式生成 XML 文档。 
     
  • 了解如何成为一名 XML 及其相关技术的 IBM 认证开发人员。 
     
  • 需要我们每周为您发送与此类似的有用的 XML 技巧文章吗?请注册以订阅 developerWorks XML 技巧时事通讯。 


关于作者

Brett McLaughlin 的照片

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

 

[审核人]初学MPEG

个人签名--------------------------------------------------------------------------------

Please Login (or Sign Up) to leave a comment