Проблемы с перезаписью дерева XML / DOM с использованием JDOM (ConcurrentModificationException)

StackOverflow https://stackoverflow.com/questions/588883

  •  09-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top