|
初见端倪……新 DOM--DOM Level 3 预览广告 初见端倪……新
DOM
Brett McLaughlin(brett@newInstance.com) 本文预览了 W3C XML 文档对象模型(DOM)级别 3,这个版本的 DOM 将在 2001 年底或 2002
年初发行。Java 开发人员兼作家 Brett McLaughlin 概述了这个即将发行的 DOM 版本中的主要特征,它将提供更好地访问 XML
文档中信息片段,更好的比较能力和普遍需要的自举过程。六小段代码样本演示了一些新的方法。 DOM 规范的当前版本,DOM 级别 2,在全世界的产品应用程序中得到了广泛使用。然而,在这个版本的规范中有一些公认的问题:最显著的是,不能自举 DOM 实现。自举提供了一种在不使用供应商特定代码的情况下装入 DOM 实现的方法,这种方法在允许应用程序使用各种语法分析器中是至关重要的。此外,节点比较在当前 DOM 规范中受到很大限制,而且 XML 文档中的某些项不可用,最显著的是 XML 声明(例如,)。幸好,目前在草拟中的 DOM 级别 3 改正了所有这些问题。在本文中,我将演示 DOM 级别 3 如何改正了这些问题,而且我将给出一个简短的预览,告诉您在这个新的改进版规范中可以找到什么内容。 信息多是件好事 清单 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 级别 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 规范。 鸡和蛋 实例化供应商的 org.w3c.dom.Document 实现并从中获取
DOMImplementation。 清单 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 方法仍然有用,诸如自举 DOM 实现和增强的节点比较之类的功能也许可以取代讨厌的现有代码。您也许还会发现在 DOM 级别 2 中需要 100 行代码的模块在 DOM 级别 3 只需要 10 行代码,那么这样就值得修改当前代码。因此虽然当级别 3 最终确定并且您升级时,您不必更改现有 DOM 代码,您也许会发现您愿意进行更改,而且更好、更整洁、更有效的程序有益于您的工作。 W3C 的工作组正在考虑其它 DOM 级别 3 功能部件,它们都很棒。就凭我在这里说明的这三个功能部件就足够让您对下一版本规范的趋向感到兴奋了。我希望您受到激励,开始关注此规范并期待出现支持新功能部件的实现。我猜测新的规范和相关工具升级将在 2001 年底或 2002 年初出现。到那时,好好温习现有 DOM 技巧,这样当 DOM 级别 3 出来时,您就可以专心研究新功能,并迅速熟悉。享受新思想带来的乐趣吧,我将在网上与您相会! 请在本文的论坛中与作者和其他读者讨论本文及其描述的技术。
如果您希望与本文章的作者或其所在机构,进一步交流,请联系:畅享网 姜小姐 jill.jiang@amteam.org | 021-51096826-112 | 在线联系 |
节能与优化IT 企业CIO过冬良策当前金融危机的影响还在继续漫延,很多企业都在苦寻过冬的良策,在这种情况下,节能与优化技术与产品无疑成为CIO们关注的首要对象,本次选题就是针对节能与优化IT来为CIO们提供过冬的良…… |
|
|