我需要走一条JDOM树并随着时间的推移做出改变;此时,更改主要是添加新元素,但也可以包括重新排序元素或删除元素。所有工作都在同一个线程上完成,因此没有并发问题。
事实证明这很困难,因为如果您尝试在遍历期间添加节点,JDOM迭代器可能会抛出ConcurrentModificationException。从我所看到的,JDOM使用列表而不是直接链接DOM节点,这使得很难动态地进行修改。
我已经看到了一些关于如何处理这个问题的建议,例如在遍历完成之后推迟添加,或者动态构建新树以使遍历的树保持不变。这些对我不起作用,因为在修改树时我需要一致的树视图。
我开始怀疑JDOM不会在这里工作。是否有任何其他Java DOM模型使这更容易?或者有没有办法在JDOM中执行此操作?
答案 0 :(得分:3)
我想出了一个使用JDOM的简单解决方案。我不是直接使用JDOM迭代器,而是使用迭代器创建节点列表,然后使用此列表进行遍历。由于此列表不是“实时”,因此我的脚本可以修改树(并查看更改)而不会影响遍历。遍历不会看到结构变化,但这应该不是问题。
答案 1 :(得分:0)
有没有理由你不能简单地做两次通过?
我熟悉的大多数算法在装饰树时不需要超过2次遍历(理想情况下,您的算法应该需要通过初始装饰,可能需要一秒钟来解析装饰后的参考)。
答案 2 :(得分:0)
由于您可以使用其他模型,因此您可以考虑使用Elliotte Rusty Harold的XOM API。它坚如磐石,不允许您创建无效的XML结构。