2009-01-09 22 views
11

Creo que tengo un problema único que resolver. Bueno, no puedo encontrar suficiente información usando Google. Así que aquí va,XML Diff and Merge

Trabajo en una aplicación Java EE SOA que almacena documentos XML como XML utilizando Oracle XML DB. Cada vez que el XML cambia, incremente la versión y lance la versión anterior en una tabla diferente.

El requisito ahora es, debo almacenar las diferencias entre 2 versiones como XML, en lugar de todo el documento XML.

  1. ¿Hay alguna biblioteca Java que pueda hacer una comparación XML? (XMLUnit, ...?)
  2. ¿Existe un esquema XML estándar para capturar las diferencias de XML?
  3. ¿Qué tecnología de transformación puedo usar para aplicar las "diferencias" a un XML para ir y venir entre versiones? (XSLT, Groovy, ....?)

Aprecio tu tiempo.

+1

En cuanto a un formato estándar, se han visto [RFC 5261] (https://tools.ietf.org/html/rfc5261)? - Parece que es anterior a tu pregunta un poco - mejor tarde que nunca. – BrainSlugs83

Respuesta

4

Hay muchas herramientas de código abierto XML diff escritas en Java desde las que puede copiar. Una lista de tales herramientas es here.

9

En mi último trabajo, tuvimos un problema similar: tuvimos que detectar cambios, inserciones y eliminaciones de elementos específicos entre dos archivos XML. Los archivos no eran XML arbitrarios; tenían que adherirse a nuestro XSD.

Nuestra solución fue implementar una especie de tipo de combinación: analizar los archivos (utilizando un analizador SAX, no un analizador DOM, para permitir archivos arbitrariamente grandes), y almacenar los datos analizados en HashMaps por separado. Luego, comparamos el contenido de los dos mapas utilizando un tipo de algoritmo de fusión tipo.

Naturalmente, cuanto más grandes eran los archivos, más presión de memoria experimentamos, así que finalmente escribí una clase FileHashMap que aumentó el espacio de valores de HashMap a archivos de acceso aleatorio. Si bien teóricamente es más lenta, esta solución permitió que nuestras comparaciones funcionaran con archivos muy grandes, sin condiciones extremas o OutOfMemoryError. (Una versión de esa clase FileHashMap está disponible en esta biblioteca: http://www.clapper.org/software/java/util/)

No tengo idea si lo que acabo de describir está remotamente cerca de lo que necesita, pero pensé que lo compartiría, por las dudas.

Buena suerte.

8

Nota al margen: ahora hay un formato estándar para "parches" compatibles con XML, en RFC 5261. Existe al menos un programa de software libre, xmlpatch, que lo implementa. Está escrito en C, puedes llamarlo desde Java.

+0

Hmm, parece que el enlace que proporcionó es libxmlpatch, que es una biblioteca C++. ¿Dónde está la herramienta de línea de comandos (y el binario de Windows)? – BrainSlugs83