Problemas con XML / DOM árbol reescribir usando JDOM (ConcurrentModificationException)

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

  •  09-09-2019
  •  | 
  •  

Pregunta

Necesito caminar un árbol JDOM y hacer cambios sobre la marcha; en este punto, los cambios son la adición de nuevos elementos en su mayoría este momento, pero también podrían incluir la reordenación de elementos o eliminación de elementos. Todo el trabajo se realiza en el mismo hilo para que no haya problemas de concurrencia.

Esto resulta ser difícil porque los iteradores JDOM pueden lanzar una ConcurrentModificationException si intenta agregar un nodo durante el recorrido. Por lo que puedo ver, JDOM usa listas en lugar de vincular directamente nodos DOM y esto hace que sea difícil de hacer modificaciones sobre la marcha.

He visto un par de recomendaciones sobre cómo hacer frente a este, tales como el aplazamiento de la suma hasta después de que el recorrido se hace, o la construcción de un nuevo árbol sobre la marcha para que el árbol atravesado mantiene sin cambios. Estos no van a funcionar para mí porque necesito una visión consistente del árbol como modifico la misma.

Estoy empezando a sospechar que JDOM no va a funcionar aquí. ¿Alguno de los otros modelos de Java DOM hacer esto más fácil? ¿O hay una manera de hacer esto en JDOM?

¿Fue útil?

Solución

Yo he llegado con lo que parece ser una solución fácil usando JDOM. En lugar de utilizar directamente el iterador JDOM, utilizo el iterador para crear una lista de nodos y luego atravieso el uso de esta lista. Dado que esta lista no es "en vivo", mis guiones pueden modificar el árbol (y ver los cambios) sin afectar el recorrido. El recorrido no va a ver cambios estructurales, pero eso no debería ser un problema.

Otros consejos

¿Hay alguna razón no se puede simplemente hacer dos pases?

La mayoría de los algoritmos que conozco no requerirá más de 2 recorridos hora de decorar un árbol (idealmente, el algoritmo debe necesitar un pase para la decoración inicial y tal vez un segundo para resolver las referencias después de la decoración).

Dado que usted está abierto a la utilización de otros modelos, puede considerar XOM API de Elliotte oxidado Harold. Es sólido como una roca, y no permitirá crear una estructura XML válido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top