让 DOM 遍历

<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> DOM Traversal 模块一瞥 Brett McLaughlin(brett@newInstance.com) Enhydra 策略顾问,Lutris Technologies 2001 年 8 月 “文档对象模型(DOM)”提供了有用的模块来以高级方式扩展其核心功能。本文深入研究了 DOM Traversal 模块,演示了如何查明您的语法分析器是否支持该模块以及如何使用它来遍历选中的节点集或整个 DOM 树。读完本文之后,您将彻底理解 DOM Traversal,并会在您的 Java 和 XML 编程工具箱中拥有一个强大的新工具。八个样本代码清单演示了这些技术。 如果您在过去三年中作过很多 XML 处理,那么您几乎一定遇到过“文档对象模型”(简称 DOM)。这种对象模型表示应用程序中的 XML 文档,并提供一种简单的方式来读取 XML 并写入或更改现有文档中的数据(如果您是 DOM 新手,请参阅参考资料来获得更多背景知识。)如果您正在努力成为一名 XML 高手,那您可能已经彻底地学过 DOM,并且知道如何使用它所提供的几乎每一种方法。然而,还有许多 DOM 功能没有被大多数开发人员认识到。 大多数开发人员实际都已接触过 DOM 核心。该核心指的是 DOM 规范,它概括 DOM 的含义、它应该如何操作以及提供哪些方法等等。甚至有经验的开发人员都不太知道或了解许多不太常用的 DOM 模块。这些模块允许开发人员更高效而轻松地使用树、同时处理不同的范围的节点、对 HTML 或 CSS 页面进行操作以及其它任务,所有这些都不是仅使用核心 DOM 规范可以做到的。在以后几个月中,我计划写几篇文章,详细介绍几个模块,包括 HTML 模块 — Range 模块 — 在本文中,将介绍 Traversal 模块。 通过学习如何使用 DOM Traversal,您将看到遍历整个 DOM 树、构建定制对象过滤器来轻易查找所需数据以及以前所未有的轻松方式遍历 DOM 树是多么快捷。我还将向您介绍一个实用程序,该程序允许您检查您选择的语法分析器是否支持特定的 DOM 模块,同时,我还将为您演示许多其它样本代码。那么,请启动您喜爱的源码编辑器,然后让我们开始。 获得信息 首先,确保您有所需工具来遍历一些示例代码。对于本文,您手头要有一个 XML 语法分析器。该语法分析器需要提供 DOM 实现。事实上,那很简单;几乎每一种您可以得到的 XML 语法分析器都支持 SAX(Simple API for XML)和 DOM。您要确保您所用的语法分析器具有 DOM 级别 2 支持,这很简单,只需阅读该语法分析器的发行说明或简单地从供应商处获得最新版本即可。 获得语法分析器之后,您需要确保它支持我们正在讨论的 DOM Traversal 模块。虽然这应该也可以在语法分析器文档中找到关于这方面的说明,但我想为您演示一个简单的编程方法来检查这一点。事实上,“清单 1”中演示的程序可以让您询问任何语法分析器:看它是否有任何模块。我在其中包括了大多数常见 DOM 模块的特定检查,当然包括 DOM Traversal。这个程序使用 DOM 类 org.w3c.dom.DOMImplementation 及其 hasFeature() 方法:通过传入每个模块的名称来检查是否支持这些模块,找出实际支持哪些模块很容易。代码相当简单,我把阅读程序流程的任务留给您。 清单 1. DOMModuleChecker 类 import org.w3c.dom.DOMImplementation; public class DOMModuleChecker { /** Vendor DOMImplementation impl class */ private String vendorImplementationClass = "org.apache.xerces.dom.DOMImplementationImpl"; /** Modules to check */ private String[] moduleNames = {"XML", "Views", "Events", "CSS", "Traversal", "Range", "HTML"}; public DOMModuleChecker() { } public DOMModuleChecker(String vendorImplementationClass) { this.vendorImplementationClass = vendorImplementationClass; } public void check() throws Exception { DOMImplementation impl = (DOMImplementation)Class.forName(vendorImplementationClass) .newInstance(); for (int i=0; i 清单 6 该清单将所有这些细节组织在一起,创建了一个搜索 XML 文档并打印出所有可搜索关键字的程序。 到目前为止,根据对其它清单的解释,您应该理解“清单 6”了。请编译此程序和清单 5 中的代码。然后,将清单 4 的内容保存为一个 XML 文档。我将我的这个文档命名为 keywords.xml。将 xerces.jar 添加到类路径和工作目录中,然后运行 KeywordSearcher 类。我知道我省略了最后一步的描述,但是如果您也是一名 Java 用户,就不应该有任何编译和设置方面的问题。在对您自己的 XML 目录副本运行这个类之后,应该得到类似于“清单 7”的结果。 清单 7. 运行关键字搜索程序 C:/javaxml2/ibm>java KeywordSearcher keywords.xml Processing file: keywords.xml Search phrase found: 'galaxy' Search phrase found: 'Hyperion' Search phrase found: 'dwarves' Search phrase found: 'hobbit' Search phrase found: 'Foundation' Search phrase found: 'Wheel of Time' Search phrase found: 'The Path of Daggers' 显然,随着文档越来越复杂,NodeFilter 实现也会相应地更加复杂。此处的要点在于,DOM Traversal 与这个小过滤器一样有用,它在更复杂的情况下会变得极其强大。例如,可以根据元素/属性名,在文档中查找表示成属性或元素的数据。对于核心 DOM 代码来说,这确实是个棘手的任务,它同样需要进行许多树的遍历,而 NodeIterator 则可以为您处理这些。因此,让您的想象力自由驰骋,并构筑那些过滤器吧! 在森林中查找树 在结束关于 DOM Traversal 的讲座之前,我要简短介绍一下 TreeWalker。由于篇幅所限(我希望这是一篇文章,而不只是一个章节),不想过于深入,但是因为您已经了解了 NodeIterator,这应该很简单。通过 清单 8 中的方法创建 TreeWalker: 如果认识到 TreeWalker 方法采用的参数与 createNodeFilter() 方法相同,那并不会引起什么问题。事实上,剩下的唯一问题是“迭代节点与遍历树有什么区别?”答案是:使用 TreeWalker 时,可以维护一个树结构。在使用 NodeIterator 时,返回的节点实际上已从其树中的初始位置分离。迭代节点使操作很快捷,因为一旦返回节点就废弃其树位置。但是,使用 TreeWalker 时,当节点从定制节点过滤器返回时,节点仍保留在它们的树上下文中。这就允许您可以实际通过过滤器来查看整个 XML 文档。 做一个练习,尝试编写一个程序来显示清单 4 中不带处理说明、注释或属性的 XML 文档。在开始前,有一个提示:首先,要使用 TreeWalker 来确保保留树格式。其次,编写一个定制的 NodeFilter 实现,以便只接受元素或文本类型的节点。最后,使用清单 6 中的程序作为模板,并更改几行代码。然后,就像那样,您自己就得到了一个定制的 DOM 树视图。如果您理解了节点部分并且可以编写出这个样本程序,那么您正在成为 DOM Traversal 高手的路上顺利前进。 希望您一直都在看 Traversal 模块所展示的所有可能性。以过滤方式遍历 DOM 树使得寻找元素、属性、文本和其它 DOM 结构变得容易。您还应该能够使用 DOM Traversal 模块编写更有效、结构更好的代码。因此,采用一个现有的搜索 DOM 树的程序,然后转换它,使其使用 traversal 方法;我知道您将对该结果感到满意。同以往一样,请让我知道本文是否对您有所帮助(使用本文所附的论坛),咱们网上见。 关于作者 Brett McLaughlin (brett@newInstance.com) 是 Lutris Technologies 的 Enhydra 策略顾问和分布式系统体系结构方面的专家。他是《Java 和 XML》(O'Reilly) 的作者。他参与了如 Java Servlet、Enterprise JavaBean 技术、XML 和商家对商家应用程序等技术的研究。他与 Jason Hunter 一起发起了 JDOM 项目,该项目为从 Java 应用程序中操纵 XML 提供了一个简单的 API。他还是 Apache Cocoon 项目和 EJBoss EJB 服务器的活跃开发人员以及 Apache Turbine 项目的共同创始人之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值