2009-02-26 48 views
1

我需要走一個JDOM樹並隨着我的進行進行更改;在這一點上,變化現在大多是添加新元素,但也可能包括重新排序元素或刪除元素。所有工作都在同一個線程上完成,因此沒有併發問題。使用JDOM重寫XML/DOM樹的問題(ConcurrentModificationException)

事實證明這很困難,因爲如果您嘗試在遍歷期間添加節點,JDOM迭代器可能會拋出ConcurrentModificationException。從我所看到的,JDOM使用列表而不是直接鏈接DOM節點,這使得很難在飛行中進行修改。

我已經看到了一些關於如何處理這個問題的建議,比如在遍歷完成之後推遲添加,或者動態構建新樹以便遍歷樹保持不變。這些對我來說不起作用,因爲我需要對樹進行一致的視圖修改。

我開始懷疑JDOM不會在這裏工作。其他任何Java DOM模型是否使這更容易?或者有沒有辦法在JDOM中做到這一點?

回答

3

我想出了使用JDOM的簡單解決方案。我不是直接使用JDOM迭代器,而是使用迭代器創建節點列表,然後使用此列表遍歷。由於這個列表不是「活的」,我的腳本可以在不影響遍歷的情況下修改樹(並查看更改)。遍歷不會看到結構變化,但這不應該是一個問題。

0

有沒有理由不能簡單地做兩遍?

大多數我熟悉的算法在裝飾樹時不需要超過2次遍歷(理想情況下,您的算法在裝飾後應該需要通過初始裝飾並且可能需要第二次解析引用)。

+0

不要認爲這樣做會很好。我提供了在每個節點上定義轉換的功能,並且腳本模型允許在轉換過程中檢查樹的其餘部分。任何類型的延期更新都意味着腳本編寫者需要處理這個問題。 – jdigital 2009-02-26 03:45:24

+0

你會建議裝飾一個JDOM節點(元素)的技術是什麼? – jdigital 2009-02-26 03:46:45

0

由於您可以使用其他型號,因此您可能會考慮Elliotte Rusty Harold的XOM API。它堅如磐石,不會讓你創建一個無效的XML結構。