我有一個需要有效遍歷的XML文檔(遞歸訪問所有節點)。Xml遍歷:替代遞歸模式?
我不確定我是否習慣使用遞歸模式,所以我想過其他模式。我太偏執了,我應該使用遞歸模式嗎?在過去,當遞歸函數的規模增大時,發現運行時錯誤已經發生在哪個堆棧上,並且發現問題變得越來越困難。
我有一個需要有效遍歷的XML文檔(遞歸訪問所有節點)。Xml遍歷:替代遞歸模式?
我不確定我是否習慣使用遞歸模式,所以我想過其他模式。我太偏執了,我應該使用遞歸模式嗎?在過去,當遞歸函數的規模增大時,發現運行時錯誤已經發生在哪個堆棧上,並且發現問題變得越來越困難。
如果您想遞歸訪問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
的條目中訪問的最後一個子元素的索引並將其用作通過子元素的循環的起始點來解決此問題。是否這足夠複雜了?)
我正在使用Selenium進行Web應用程序功能測試。我似乎無法在Eclipse中使用100%的調試模式,因爲在調試模式下逐步執行時,FireFox瀏覽器不會啓動。 – KJW 2011-04-01 07:33:10
尚不清楚你想做什麼。您可以使用SAX事件處理程序並避免遞歸,也可以使用尾遞歸(所有現代編譯器均優化尾循環到循環,並且不會發生堆棧溢出)。 – khachik 2011-03-29 08:22:59
@khachik,遞歸訪問xml中的所有節點。 – KJW 2011-03-29 10:00:36
我的意思是:遞歸訪問做什麼? – khachik 2011-03-29 10:25:04