Problemas com XML / árvore DOM reescrever usando JDOM (ConcurrentModificationException)

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

  •  09-09-2019
  •  | 
  •  

Pergunta

Eu preciso de andar uma árvore e fazer JDOM mudanças como eu ir junto; Neste ponto, as alterações são principalmente a adição de novos elementos agora, mas também poderia incluir reordenação elementos ou removendo elementos. Todo o trabalho é feito no mesmo segmento para que não haja problemas de concorrência.

Esta acaba por ser difícil porque iterators JDOM pode jogar uma ConcurrentModificationException se você tentar adicionar um nó durante a travessia. Pelo que posso ver, JDOM usa listas em vez de ligar diretamente nós DOM e isso faz com que seja difícil de fazer modificações na mosca.

Eu vi um par de recomendações sobre como lidar com isso, como o adiamento da acrescenta até depois da travessia é feita, ou a construção de uma nova árvore na mosca modo que a árvore atravessada permanece inalterado. Estes não vai funcionar para mim, porque eu preciso de uma visão consistente da árvore como eu modificá-lo.

Eu estou começando a suspeitar que JDOM só não vai funcionar aqui. Será que algum dos outros modelos Java DOM tornar isso mais fácil? Ou há uma maneira de fazer isso em JDOM?

Foi útil?

Solução

Eu vim com o que parece ser uma solução fácil usando JDOM. Ao invés de usar o JDOM iterador diretamente, eu uso o iterador para criar uma lista de nós e, em seguida, atravessar usando esta lista. Uma vez que esta lista não é "ao vivo", meus scripts podem modificar a árvore (e ver as alterações) sem afetar o percurso. A travessia não verá mudanças estruturais, mas que não deve ser um problema.

Outras dicas

Existe uma razão que você não pode simplesmente fazer dois passes?

A maioria dos algoritmos que eu estou familiarizado com não vai exigir mais de 2 traversals ao decorar uma árvore (idealmente, o seu algoritmo deve precisa de um passe para a decoração inicial e talvez um segundo para resolver referências após a decoração).

Uma vez que você está aberto para o uso de outros modelos, você pode considerar XOM API do Elliotte Rusty Harold. É de rocha sólida, e não permitirá que você crie uma estrutura XML inválido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top