初见端倪……新 DOM--DOM Level 3 预览

2002-8-19 13:39:04【作者】 畅享网 【进入论坛】
广告

初见端倪……新 DOM  
 
--DOM Level 3 预览

 

Brett McLaughlin(brett@newInstance.com

Enhydra 策略顾问,Lutris Technologies

2001 年 8 月

本文预览了 W3C XML 文档对象模型(DOM)级别 3,这个版本的 DOM 将在 2001 年底或 2002 年初发行。Java 开发人员兼作家 Brett McLaughlin 概述了这个即将发行的 DOM 版本中的主要特征,它将提供更好地访问 XML 文档中信息片段,更好的比较能力和普遍需要的自举过程。六小段代码样本演示了一些新的方法。

文档对象模型(DOM)经证明是当今最流行的用于操作 XML 的 API。它以基于对象的形式表示 XML 文档,从而使已经熟悉对象的 Java 程序员和其他开发人员易于操作。此外,它可以跨语言工作,因此它在 JavaScript/ECMAScript、C 和其它语言中提供了对 XML 的访问权。虽然本文中的代码样本都是以 Java 编写的,但详细的更改可以在 DOM 级别 3 规范的所有语言绑定(对于某种特定编程语言的规范映射)中使用。

DOM 规范的当前版本,DOM 级别 2,在全世界的产品应用程序中得到了广泛使用。然而,在这个版本的规范中有一些公认的问题:最显著的是,不能自举 DOM 实现。自举提供了一种在不使用供应商特定代码的情况下装入 DOM 实现的方法,这种方法在允许应用程序使用各种语法分析器中是至关重要的。此外,节点比较在当前 DOM 规范中受到很大限制,而且 XML 文档中的某些项不可用,最显著的是 XML 声明(例如,)。幸好,目前在草拟中的 DOM 级别 3 改正了所有这些问题。在本文中,我将演示 DOM 级别 3 如何改正了这些问题,而且我将给出一个简短的预览,告诉您在这个新的改进版规范中可以找到什么内容。

信息多是件好事

开发人员经常抱怨的 DOM 当前版本的问题之一就是不能查询 XML 文档的各部分内容。虽然它可以用许多方法获取一个元素或属性,它却不可能查明文档的 XML 声明中指定了什么版本,或者该文档是否被标记成独立的。例如,清单 1 显示了一个非常简单的 XML 文档。

清单 1. 基本 XML 文档 

 Robin

Kessinger

Bryan

Sutton

虽然它可以找到清单 1 中第二个 firstName 元素的文本内容,但它不能查明文档的编码。但是,DOM 级别 3 通过向 org.w3c.dom.Document 接口添加了几个新方法来处理这个问题 — 该接口是以 DOM 表示 XML 文档的顶级对象。

接口的实际方法签名类似于清单 2 中 Java 语言绑定所显示的那样。

清单 2. org.w3c.dom.Document 接口的新方法

// Access to the XML version

public String getVersion();

public void setVersion(String version);

// Access to the document encoding

public String getEncoding();

public void setEncoding(String encoding);

// Access to the encoding of the document in Java

public String getActualEncoding();

public void setActualEncoding(String actualEncoding);

// Access to the 'standalone' attribute

public boolean getStandalone();

public void setStandalone(boolean standalone);

清单 2 中演示的方法是一目了然的,而且很必要。如果使用它们,就可以获取 — 并且设置 — XML 文档的版本。目前,XML 版本几乎总是 1.0,但将来使用这个方法将变得非常方便。新方法还允许访问文档的指定编码,以及 Java(或任何其它语言)中的 DOM 对象的编码。这非常重要,因为文本数据的编码不会一直与 Java 匹配。例如,XML 文档中的编码 UTF-8 通常转换成 Java 中的编码 UTF8。那是个很微妙的差别,但是它可能会使您的程序大不相同。最后,在这些新方法中还向开发人员提供了独立变量作为数据。

最重要的是,DOM 级别 3 向开发人员提供了更多信息,而信息多总是件好事。即使您还不需要这种特殊数据,也许有一天您会需要它,您可以期望它在即将到来的 DOM 级别 3 规范中出现。

两者各不相同

DOM 级别 2 中的另一个薄弱环节是节点比较。虽然 Java,所以用 Java 编写的 DOM 实现也,提供了简单对象等同性(==),但是 DOM 级别 2 中没有内置方法允许结构等同性测试。根据结构等同性,我可以查询两个名为“person”的元素是否拥有相同的文本内容。根据对象在 JVM 中引用的内存判断,它们也许不一致,但它们也许有一致的内容。还有一种常见情况是想要知道两个元素是否有完全相同的子元素等。这些比较,通常称作 深比较,还不可能在 DOM 规范的当前版本中实现。

我很高兴地报告大家 DOM 级别 3 解决了这些比较问题。有两个新方法允许这些比较,它们都在 org.w3c.dom.Node 接口上。清单 3 显示了新方法。

清单 3. org.w3c.dom.Node 接口上的比较方法

// Compare the node this is invoked on to another node for object equality

public boolean isSameNode(Node input);

// Test another node for structural equality, and possibly do a "deep" comparison

public boolean equalsNode(Node input, boolean deep);

清单 3 中的方法是一目了然的。唯一值得注意的是 equalsNode() 方法中的 deep 参数。如果这个值被设置成 false,那么只比较这个节点本身。比较将包括节点名称(如在元素中)、节点的值(如在属性中)和其它任何属于节点自身的东西。如果将值设置成 true,那么还将比较所有子节点。例如,请查看清单 4 中的样本文档。

清单 4. 用于试验比较的样本 XML 文档

 Dan

Simmons>/lastName>

Robert

 Jordan>/lastName>

如果将清单 4 中的结构理解成 DOM,那么您就可以使用 equalsNode() 方法执行一些比较。例如,可以比较第一和第二个名为 firstName 的元素。如果对 deep 参数提供了 false 值,那么比较将返回 true。这两个元素同名,因此在浅比较中显得相同。但是,如果对 deep 参数提供了 true 值,您会得到 false 结果,因为被比较节点的嵌套子节点(在这两种情况下,是单个 org.w3c.dom.Text 节点)是不同的。因此,您可以了解到使用 deep 参数的正确值对于如何做比较有着重大的影响。

无论是执行深比较还是浅比较,新的 DOM 级别 3 方法允许您比较文档的各个部分,以及不同文档的某些部分。我不想深入研究这些方法可以有所帮助的所有用例,只是想简要地介绍一些,今天我可以在基于 SOAP 的应用程序、XML 编辑器和使用 Enhydra XMLC 的工作中使用这些方法。在每种情况下,能够比较节点的结构等同性会大大改进当前 DOM 规范。

鸡和蛋

最后,我想要讨论我认为是对 DOM 级别 3 的最佳补充:自举 DOM 实现的能力。首先,现在让我演示它的工作方式。您可以:

实例化供应商的 org.w3c.dom.Document 实现并从中获取 DOMImplementation。

或者,实例化供应商的 org.w3c.dom.DOMImplementation 实现,并从中获取 org.w3c.dom.Document 对象。

可以看到,这就是一个鸡和蛋的方案。在任何一个方案中,您都必须使用供应商特定的代码,以求进展。有关正在使用的这种情况的示例,请查看清单 5,它显示了使用第二种选项时的情况。

清单 5. 实例化供应商的 org.w3c.dom.DOMImplementation

DOMImplementation domImpl = new org.apache.xerces.dom.DOMImplementationImpl();

Document domDoc = domImpl.createDocument("http://www.ibm.com/developer", "article", null);

清单 5 中的代码是不可移植的,它不能使用多个语法分析器 — 这在能共同使用的世界里不是件好事。有种装入供应商的实现而不实际在代码中指定实现的方法更为可取。那些熟悉 Java 和 XML 编程的开发人员也许会想念 JAXP(请参阅参考资料以获取关于 JAXP 的更多信息)。虽然 JAXP 提供了可移植性问题的解决方案,但是许多开发人员想要直接使用 DOM,而不要求助于外部的软件包来完成简单的任务。显然,DOM 规范的作者同意那种观点,因为在 DOM 级别 3 中加入了自举机制。尽管具体细节还会有所变化,但清单 6 显示了这个机制可能的特征。

清单 6. 用 DOM 级别 3 自举(随着规范的日益成熟还会有所变化)

mport org.w3c.dom.Document;

mport org.w3c.dom.DOMImplementation;

import org.w3c.dom.DOMImplementationFactory;

// Class declaration and other Java constructs

DOMImplementation domImpl = 

DOMImplementationFactory.getDOMImplementation();

Document doc = domImpl.createDocument();

这里主要的补充是新的 DOM 类 org.w3c.dom.DOMImplementationFactory。DOM 供应商(如 Apache Xerces)可以提供它们自己的 factory 类版本,它会装入特定版本的 DOMImplementation 实现类(是的,我知道,有一点麻烦),然后在调用 getDOMImplementation() 时返回它。另外,DOMImplementationFactory 类提供了一种使用系统特性(由程序设置或经由命令行)来指定要装入的备用实现的方法。因为还没有确定具体细节,我就不在代码样本中演示其工作方式了。尽管如此,仍可以向您保证它比当前方法更容易。

还更改了什么?

在 DOM 级别 3 规范中还更改了什么?到目前为止,我主要讨论了补充功能,但还没有提到任何对现有 DOM 功能的修改。可是,这很正常。全世界为了避免应用程序破坏,因此有一个相当常见的策略,它要求标准组织努力避免在很好用的规范新版本中失去向后兼容性。DOM 级别 3 当然不会违反这个规则。简要地说,您不必为了使用 DOM 级别 3 实现而更改现有 DOM 代码。只要下载新版本并运行它就可以了。

但是,您也许想要做一些更改。即使您了解并喜爱的 DOM 方法仍然有用,诸如自举 DOM 实现和增强的节点比较之类的功能也许可以取代讨厌的现有代码。您也许还会发现在 DOM 级别 2 中需要 100 行代码的模块在 DOM 级别 3 只需要 10 行代码,那么这样就值得修改当前代码。因此虽然当级别 3 最终确定并且您升级时,您不必更改现有 DOM 代码,您也许会发现您愿意进行更改,而且更好、更整洁、更有效的程序有益于您的工作。

W3C 的工作组正在考虑其它 DOM 级别 3 功能部件,它们都很棒。就凭我在这里说明的这三个功能部件就足够让您对下一版本规范的趋向感到兴奋了。我希望您受到激励,开始关注此规范并期待出现支持新功能部件的实现。我猜测新的规范和相关工具升级将在 2001 年底或 2002 年初出现。到那时,好好温习现有 DOM 技巧,这样当 DOM 级别 3 出来时,您就可以专心研究新功能,并迅速熟悉。享受新思想带来的乐趣吧,我将在网上与您相会!

参考资料

请在本文的论坛中与作者和其他读者讨论本文及其描述的技术。

有关 DOM 的完整详细信息,请从 W3C 的
DOM Activity Page 开始学习。

请参考当前 DOM 规范,
DOM 级别 2

请阅读
DOM 级别 3 规范

请阅读由作者撰写的相关 developerWorks 文章
Bone up on JAXP,它介绍了用于 XML 处理的 Java API。

有关 IBM WebSphere 3.0 如何支持 DOM 处理的详细信息和 XML 的其它问题,请查阅在线帮助的“What is: XML”部分。

关于作者

Brett McLaughlin 是 Lutris Technologies 的 Enhydra 策略顾问,专长于分布式系统体系结构方面。他是 Java and XML(O'Reilly)的作者。他参与了如 Java Servlet、Enterprise JavaBean 技术、XML 和商家对商家应用程序等技术的研究。他与 Jason Hunter 一起发起了 JDOM 项目,该项目为从 Java 应用程序中操纵 XML 提供了一个简单的 API。他还是 Apache Cocoon 项目和 EJBoss EJB 服务器的活跃开发人员以及 Apache Turbine 项目的共同创始人之一。可以通过 brett@newInstance.com 联系作者。

如果您希望与本文章的作者或其所在机构,进一步交流,请联系:畅享网 姜小姐
jill.jiang@amteam.org | 021-51096826-112 | 在线联系
老孙的IT运维管理之道[原创]用户的BSM用户的IT业务管..

从企业实际的IT运营角度来看,BSM是推动IT与业务融合,实现、改善WCNG司IT管理和治理的最佳实践之一。

吕建伟 专栏和CIO问答软件项目实施管理

现实中很少能按照正规流程来的,所以只能把流程中的各个环节拆开,个个击破,以后就可以见招拆招了。

ITIL实施:CIO时刻准备着

千军易得,一将难求,要推进ITIL实施,CIO扮演的角色不容忽视。吹响集结号,CIO出击的时刻已经来到。

节能与优化IT 企业CIO过冬良策

当前金融危机的影响还在继续漫延,很多企业都在苦寻过冬的良策,在这种情况下,节能与优化技术与产品无疑成为CIO们关注的首要对象,本次选题就是针对节能与优化IT来为CIO们提供过冬的良……