Problemi con XML / DOM albero riscrittura usando JDOM (ConcurrentModificationException)

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

  •  09-09-2019
  •  | 
  •  

Domanda

ho bisogno di camminare un albero JDOM e apportare le modifiche come vado avanti; A questo punto, i cambiamenti sono per lo più l'aggiunta di nuovi elementi in questo momento, ma potrebbe anche includere elementi di riordino o la rimozione di elementi. Tutto il lavoro viene fatto sullo stesso thread quindi non ci sono problemi di concorrenza.

Questo si rivela essere difficile perché iteratori JDOM possono lanciare una ConcurrentModificationException se si tenta di aggiungere un nodo durante l'attraversamento. Da quello che posso vedere, JDOM utilizza liste invece di collegare direttamente nodi DOM e questo rende difficile fare modifiche al volo.

Ho visto un paio di raccomandazioni su come affrontare questo, come ad esempio rinviando la aggiunge fino a dopo l'attraversamento è fatto, o la costruzione di un nuovo albero al volo in modo che l'albero attraversato rimane invariato. Questi non funziona per me, perché ho bisogno di una visione coerente del l'albero come ho modificarlo.

Comincio a sospettare che JDOM semplicemente non funzionerà qui. Qualcuno degli altri modelli Java DOM rendere questo più facile? O c'è un modo per fare questo in JDOM?

È stato utile?

Soluzione

Sono venuto su con quello che appare come una soluzione facile usando JDOM. Invece di utilizzare direttamente l'iteratore JDOM, io uso l'iteratore per creare una lista di nodi e poi poligonale utilizzando questa lista. Dal momento che questo elenco non è "live", i miei script possono modificare l'albero (e vedere le modifiche) senza influenzare l'attraversamento. L'attraversamento non vedrà modifiche strutturali, ma che non dovrebbe essere un problema.

Altri suggerimenti

C'è un motivo non si può semplicemente fare due passi?

La maggior parte algoritmi ho familiarità con non richiederà più di 2 attraversamenti quando decorare un albero (idealmente, l'algoritmo dovrebbe aver bisogno di un pass per la decorazione iniziale e forse un secondo per risolvere i riferimenti dopo la decorazione).

Dal momento che si sono aperti a utilizzare altri modelli, si potrebbe considerare XOM API Elliotte Rusty Harold. E 'solida roccia, e non permetterà di creare una struttura XML non valido.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top