2011-03-29 85 views
0

我有一个需要有效遍历的XML文档(递归访问所有节点)。Xml遍历:替代递归模式?

我不确定我是否习惯使用递归模式,所以我想过其他模式。我太偏执了,我应该使用递归模式吗?在过去,当递归函数的规模增大时,发现运行时错误已经发生在哪个堆栈上,并且发现问题变得越来越困难。

+0

尚不清楚你想做什么。您可以使用SAX事件处理程序并避免递归,也可以使用尾递归(所有现代编译器均优化尾循环到循环,并且不会发生堆栈溢出)。 – khachik 2011-03-29 08:22:59

+0

@khachik,递归访问xml中的所有节点。 – KJW 2011-03-29 10:00:36

+0

我的意思是:递归访问做什么? – khachik 2011-03-29 10:25:04

回答

1

如果您想递归访问XML文档中的所有元素,使用递归确定似乎是明显的选择。如果由于递归函数太大而不知道发生了什么栈运行时错误,因此您在查看问题时遇到问题,问题更可能出现在调试技术上,而不是递归本身。

但是,如果你真的决定这样做,你可以建立一个浏览器对象来遍历XML而不使用递归。相反,你必须建立一个到目前为止你所访问过的所有元素的列表(以及哈希表)。一些伪代码为访问者:

while current_element != null: 
    if current_element not in elements_visited: 
     process current_element 
     add current_element to elements_visited 
    next_element = null 
    for each child of current_element: 
     if child is not in elements_visited: 
     next_element = child 
     break 
    if next_element == null: 
     next_element = current_element.parent 
    current_element = next_element 

这不保持堆栈,但你为它付出与孩子轴每次重温元素的时间穿越。 (你可以通过存储在elements_visited的条目中访问的最后一个子元素的索引并将其用作通过子元素的循环的起始点来解决此问题。是否这足够复杂了?)

+0

我正在使用Selenium进行Web应用程序功能测试。我似乎无法在Eclipse中使用100%的调试模式,因为在调试模式下逐步执行时,FireFox浏览器不会启动。 – KJW 2011-04-01 07:33:10