Problèmes avec l'arbre XML / DOM réécriture en utilisant JDOM (ConcurrentModificationException)

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

  •  09-09-2019
  •  | 
  •  

Question

Je dois marcher un arbre JDOM et apporter des modifications que je vais le long; à ce stade, les changements sont le plus souvent ajouter de nouveaux éléments en ce moment, mais pourraient également inclure des éléments ou réorganisant suppression d'éléments. Tout le travail est fait sur le même thread donc il n'y a pas de problèmes de concurrence.

Cela s'avère être difficile parce itérateurs JDOM peut jeter un ConcurrentModificationException si vous essayez d'ajouter un nœud au cours traversal. D'après ce que je peux voir, JDOM utilise des listes au lieu de relier directement les noeuds DOM, ce qui rend difficile de faire des modifications à la volée.

Je l'ai vu quelques recommandations sur la façon de traiter ce, comme le report ajoute qu'après la traversée se fait, ou la construction d'un nouvel arbre à la volée afin que l'arbre traversé reste inchangé. Ceux-ci ne fonctionnera pas pour moi parce que je besoin d'une vision cohérente de l'arbre que je le modifier.

Je commence à penser que JDOM ne fonctionnera pas ici. Est-ce que l'un des autres modèles Java DOM vous faciliter la tâche? Ou est-il un moyen de faire en JDOM?

Était-ce utile?

La solution

Je suis venu avec ce qui ressemble à une solution facile en utilisant JDOM. Plutôt que d'utiliser l'itérateur JDOM directement, j'utilise l'itérateur pour créer une liste de nœuds, puis parcourir en utilisant cette liste. Étant donné que cette liste ne sont pas « en direct », mes scripts peuvent modifier l'arbre (et voir les changements) sans affecter la traversal. Le traversal ne verra pas des changements structurels mais qui ne devrait pas être un problème.

Autres conseils

Y at-il une raison que vous ne pouvez pas simplement faire deux passes?

La plupart des algorithmes que je connais ne nécessitera pas plus de 2 traversals lors de la décoration d'un arbre (idéalement, votre algorithme devrait avoir besoin d'une passe pour la décoration initiale et peut-être une seconde pour résoudre les références après la décoration).

Puisque vous êtes ouvert à l'aide d'autres modèles, vous pourriez envisager XOM API. Il est solide comme le roc, et ne vous permettra pas de créer une structure XML non valide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top