Проблемы с переписыванием дерева XML / DOM с использованием JDOM (ConcurrentModificationException) - PullRequest
1 голос
/ 26 февраля 2009

Мне нужно пройтись по дереву JDOM и вносить изменения по мере продвижения вперед; на этом этапе изменения в основном добавляют новые элементы прямо сейчас, но могут также включать изменение порядка элементов или удаление элементов. Вся работа выполняется в одном потоке, поэтому нет проблем с параллелизмом.

Это оказывается трудным, потому что итераторы JDOM могут выдать исключение ConcurrentModificationException, если вы попытаетесь добавить узел во время обхода. Из того, что я вижу, JDOM использует списки вместо прямой связи узлов DOM, и это затрудняет внесение изменений на лету.

Я видел пару рекомендаций о том, как с этим справиться, например, отложить добавления до завершения обхода или построить новое дерево на лету, чтобы пройденное дерево осталось без изменений. Они не будут работать для меня, потому что мне нужно единообразное представление дерева при его изменении.

Я начинаю подозревать, что JDOM просто не будет работать здесь. Облегчает ли это какая-либо другая модель Java DOM? Или есть способ сделать это в JDOM?

Ответы [ 3 ]

3 голосов
/ 26 февраля 2009

Я придумал, как выглядит простое решение с использованием JDOM. Вместо того, чтобы использовать итератор JDOM напрямую, я использую итератор для создания списка узлов, а затем перехожу по этому списку. Поскольку этот список не является «живым», мои сценарии могут изменять дерево (и видеть изменения), не влияя на обход. Обход не увидит структурных изменений, но это не должно быть проблемой.

0 голосов
/ 26 февраля 2009

Поскольку вы открыты для использования других моделей, вы можете рассмотреть API-интерфейс Elliotte Rusty Harold XOM . Он надежен и не позволит вам создать недопустимую структуру XML.

0 голосов
/ 26 февраля 2009

Есть ли причина, по которой вы не можете просто сделать два прохода?

Большинство алгоритмов, с которыми я знаком, не требуют более 2 обходов при декорировании дерева (в идеале, вашему алгоритму должен потребоваться проход для начального оформления и, возможно, секунда для разрешения ссылок после оформления).

...