Java 使用JDOM重写XML/DOM树的问题(ConcurrentModificationException)

Java 使用JDOM重写XML/DOM树的问题(ConcurrentModificationException),java,xml,dom,jdom,Java,Xml,Dom,Jdom,我需要在JDOM树上行走,并在前进的过程中进行更改;此时,更改主要是现在添加新元素,但也可能包括对元素重新排序或删除元素。所有工作都在同一个线程上完成,因此不存在并发问题 这很困难,因为如果在遍历期间尝试添加节点,JDOM迭代器会抛出ConcurrentModificationException。从我看到的情况来看,JDOM使用列表而不是直接链接DOM节点,这使得动态修改非常困难 我已经看到了一些关于如何处理这个问题的建议,比如将添加延迟到遍历完成之后,或者动态地构建一个新的树,以便遍历的树保持

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

这很困难,因为如果在遍历期间尝试添加节点,JDOM迭代器会抛出ConcurrentModificationException。从我看到的情况来看,JDOM使用列表而不是直接链接DOM节点,这使得动态修改非常困难

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


我开始怀疑JDOM在这里不起作用。其他Java DOM模型是否使这更容易实现?或者在JDOM中有什么方法可以做到这一点吗?

有什么原因不能简单地做两次传递吗


我熟悉的大多数算法在装饰一棵树时不需要超过2个遍历(理想情况下,你的算法需要一个初始装饰的通行证,也许在装修后要解决一个引用)。

< P>既然你愿意使用其他的模型,你可以考虑Elliotte Rusty Harold的API。它坚如磐石,不允许您创建无效的XML结构。

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

不要认为这样做会很好。我提供了在每个节点定义转换的能力,脚本模型允许在转换期间检查树的其余部分。任何类型的延迟更新都意味着脚本编写者需要处理这个问题;它不公开迭代器,因此不可能出现并发修改异常。子节点的遍历是通过其节点索引进行的。