2009-02-26 4 views
1

Je dois parcourir un arbre JDOM et apporter des modifications au fur et à mesure; À ce stade, les modifications consistent principalement à ajouter de nouveaux éléments dès maintenant, mais pourraient également inclure des éléments de réorganisation ou de suppression d'éléments. Tout le travail est effectué sur le même thread, donc il n'y a pas de problèmes de concurrence.Problèmes de réécriture de l'arborescence XML/DOM à l'aide de JDOM (ConcurrentModificationException)

Cela s'avère difficile car les itérateurs JDOM peuvent lancer une exception ConcurrentModificationException si vous essayez d'ajouter un nœud pendant la traversée. D'après ce que je peux voir, JDOM utilise des listes au lieu de relier directement les nœuds DOM, ce qui rend difficile les modifications à la volée.

J'ai vu quelques recommandations sur la façon de gérer cela, comme reporter les ajouts jusqu'à la fin de la traversée, ou construire un nouvel arbre à la volée pour que l'arbre traversé reste inchangé. Ceux-ci ne fonctionneront pas pour moi parce que j'ai besoin d'une vue cohérente de l'arbre pendant que je le modifie. Je commence à soupçonner que JDOM ne fonctionnera pas ici. Est-ce que l'un des autres modèles Java DOM facilite cela? Ou y a-t-il un moyen de le faire dans JDOM?

Répondre

3

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 cette liste. Comme cette liste n'est pas "live", mes scripts peuvent modifier l'arborescence (et voir les changements) sans affecter la traversée. La traversée ne verra pas de changements structurels mais cela ne devrait pas poser de problème.

0

Y a-t-il une raison pour laquelle vous ne pouvez pas simplement faire deux passes?

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

+0

Ne pensez pas que cela fonctionnera bien. Je fournis la possibilité de définir des transformations à chaque nœud et le modèle de script permet d'examiner le reste de l'arbre pendant la transformation. Tout type de mise à jour différée signifie que le scripteur doit gérer cela. – jdigital

+0

Quelle technique suggéreriez-vous pour décorer un nœud JDOM (Element)? – jdigital

0

Puisque vous êtes ouvert à l'utilisation d'autres modèles, vous pouvez envisager l'API XOM d'Elliotte Rusty Harold. Il est solide et ne vous permettra pas de créer une structure XML invalide.

+0

Peut-il gérer cette tâche? – jdigital

+0

Oui; il n'expose pas les itérateurs, il n'y a donc aucune chance d'obtenir une exception de modification simultanée. La traversée des nœuds enfants se fait par leur index de nœud. – erickson