1

我需要遍历 JDOM 树并进行更改;目前,更改主要是添加新元素,但也可能包括重新排序元素或删除元素。所有工作都在同一个线程上完成,因此不存在并发问题。

事实证明这很困难,因为如果您尝试在遍历期间添加节点,JDOM 迭代器可能会抛出 ConcurrentModificationException。据我所知,JDOM 使用列表而不是直接链接 DOM 节点,这使得动态修改变得困难。

我已经看到了一些关于如何处理这个问题的建议,例如将添加推迟到遍历完成之后,或者动态构建一个新树,以便遍历的树保持不变。这些对我不起作用,因为我在修改树时需要一致的视图。

我开始怀疑 JDOM 在这里行不通。是否有任何其他 Java DOM 模型使这更容易?或者有没有办法在 JDOM 中做到这一点?

4

3 回答 3

3

我想出了一个使用 JDOM 的简单解决方案。我没有直接使用 JDOM 迭代器,而是使用迭代器创建一个节点列表,然后使用这个列表进行遍历。由于此列表不是“实时”的,因此我的脚本可以修改树(并查看更改)而不影响遍历。遍历不会看到结构变化,但这应该不是问题。

于 2009-02-26T19:01:22.853 回答
0

你有理由不能简单地做两次传球吗?

我熟悉的大多数算法在装饰树时不需要超过 2 次遍历(理想情况下,您的算法应该需要一个通道来进行初始装饰,并且可能需要第二个来解决装饰后的引用)。

于 2009-02-26T02:48:09.290 回答
0

由于您愿意使用其他模型,因此您可能会考虑 Elliotte Rusty Harold 的XOM API。它坚如磐石,不允许您创建无效的 XML 结构。

于 2009-02-26T04:49:24.803 回答