以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 DTD/XML Schema 』 (http://bbs.xml.org.cn/list.asp?boardid=23) ---- 技巧:使用TreeWalker遍历XML文档 (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=12037) |
-- 作者:anchen0617 -- 发布时间:11/13/2004 3:01:00 PM -- 技巧:使用TreeWalker遍历XML文档 XML 的 Document Object Model (文档对象模型,简称 DOM) 提供了一系列的对象和方法以便于开发者遍历一个文档所包含的树状结构。但一般而言,该处理过程包含了NodeList和递归循环的方法调用,这使得我们很容易在文档的数据结构中迷失当前的位置。DOM Level 2 中的Traversal module提供了一个新的TreeWalker对象,能够简化原先的过程并使得操作更为可靠。本文描述了如何确定TreeWalker可用性的过程以及如何使用该对象来从文档中获取相应的信息。 注:本文使用了JAXP,但所举的样例程序也可以在Xerces-Java 2中工作,其核心思想同样能够在其它的XML解析环境中得到应用。 DOM提供了像Node这样包含了诸如getFirstChild() 和 getNextSibling()方法的接口。和getChildNodes()等相结合,这些方法提供了一个遍历XML文档的途径,即通过递归来分析每一个子节点的集合。 TreeWalker的工作机制与此相似,但更为规范。该对象实际上使用了nextNode()方法代替递归调用来对整个结构进行浏览。每次要移动到下一个节点的时候,currentNode属性会指向新的节点,这样TreeWalker对文档当前节点的位置就会了然于胸。举例来说,在清单1中,有一个包含紧急情况下联系雇员列表的文档: 清单1. 源文档
创建TreeWalker对象 DocumentTraversal对象是遍历模型中所有对象的类工厂。创建TreeWalker对象同样需要它的支持。实际上正如清单 2中所示那样,实例化一个TreeWalker需要四个参数。 清单2. 初始化TreeWalker对象 public class ShowDocument { public static void main (String args[]) { Node root = doc.getDocumentElement(); DocumentTraversal traversal = (DocumentTraversal)doc; } else {
在创建时,TreeWalker需要知道四个信息: 从什么地方开始 判断什么节点对TreeWalker对象可见是个有点复杂的问题。在开始阶段,你可以决定TreeWalker是否能够看到所有的节点还是某些特定类型的节点。如这里所示,whattoshow参数的值能够很容易地被NodeFilter接口所定义的常数改变。最常用的取值是NodeFilter.SHOW_ALL,而像NodeFilter.SHOW_ELEMENT和NodeFilter.SHOW_TEXT这样的常量值则是为其对应的节点类型所准备的。 除此之外,NodeFilter也能够使用相当复杂的筛选条件。我们可以自定义只传送某些值到TreeWalker 的NodeFilter。举例来说,一个NodeFilter能够只传递当前节点的employees部分给TreeWalker对象。在这里,因为应用程序初始化时会设为能够访问所有的节点,所以没有任何NodeFilter被传递到TreeWalker对象。 遍历树状结构 现在TreeWalker可以遍历文档的树状结构了。最简单的例子是walker对象从根节点开始向下移动,如清单3所示。 清单3. TreeWalker开始遍历树状结构的过程 } else {
清单4. walker对象返回null employee: null deptid: null shift: null status: null
在树状结构中自由移动 遍历文档是很简单的过程,也能够被其它方法所实现。对于TreeWalker对象,它的能力还表现在处理文档的同时能够记住这个文档的层次结构。例如,walker对象知道自己处于树状结构中的具体位置,所以当遇到某个status元素的时候,它就有能力检查该文本子节点的值并可以从它的双亲节点返回其相应的属性。 清单5. walker对象对status节点的反应 Element employeeElement = (Element)employeeNode; System.out.println("Now contacting employee number " + empId); } else {
|
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
7,548.828ms |