2012-04-25 30 views
5

Tengo que los archivos xml dicen abc.xml & 123.xml que son casi similares, quiero decir tiene el mismo contenido, pero el segundo es decir, 123.xml tiene más contenido que el anterior . Quiero leer los archivos usando Java y comparar si el contenido presente en abc.xml para cada etiqueta es el mismo que en 123.xml, algo así como la comparación de objetos. Por favor sugiérame cómo leer el archivo xml usando java y comenzar a comparar.Comparando dos archivos xml usando JAVA

Gracias.

+2

En su caso, probablemente sugeriría el analizador DOM (siempre que sus archivos no sean enormes). Entonces tendría efectivamente sus objetos y podría compararlos campo por campo. –

+0

¿Qué sucederá si hay dos nodos con la misma etiqueta? ¿Cómo van a comparar? –

+0

En realidad, todos los contenidos de abc.xml están presentes en 123.xml. Solo quiero verificar que los elementos con etiquetas en abc.xml estén en 123.xml. –

Respuesta

5

me inclinaría por la XMLUnit. Las características que proporciona:

  • las diferencias entre dos piezas de XML
  • El resultado de la transformación de una pieza de XML utilizando XSLT
  • La evaluación de una expresión XPath en un pedazo de XML
  • El validez de una pieza de XML
  • nodos individuales en una pieza de XML que están expuestos por DOM Traversal

¡Buena suerte!

1

Bueno, si sólo quiere comparar y mostrar a continuación, puede utilizar Guiffy

Es una buena herramienta. Si quieres hacer el procesamiento en back-end, entonces debes usar el analizador DOM carga ambos archivos en 2 objetos DOM y compara atributo por atributo.

4

Usaría JAXB para generar objetos Java a partir de los archivos XML y luego comparar los archivos Java. Harían el manejo mucho más fácil.

12

si lo que desea comparar y luego utilice esto:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setCoalescing(true); 
dbf.setIgnoringElementContentWhitespace(true); 
dbf.setIgnoringComments(true); 
DocumentBuilder db = dbf.newDocumentBuilder(); 

Document doc1 = db.parse(new File("file1.xml")); 
doc1.normalizeDocument(); 

Document doc2 = db.parse(new File("file2.xml")); 

doc2.normalizeDocument(); 
Assert.assertTrue(doc1.isEqualNode(doc2)); 

más vea esta http://xmlunit.sourceforge.net/

+0

¿Se puede utilizar esto si uno de los documentos xml está calificado con espacios de nombres pero el otro no? – ziggy

0

es un poco exagerado, pero si su XML tiene un esquema, puede convertirlo en el metamodelo EMF & y luego usar EMF Compare para comparar.

3

En general, si sabe que tiene dos archivos con estructura idéntica pero con contenido ligeramente diferente y sin orden, tendrá que "leer" los archivos para comparar los contenidos.

Si tiene el Esquema XML para sus archivos XML, puede usar JAXB para crear un conjunto de clases que representarán el DOM específico definido por su esquema XML. El beneficio de este enfoque es que no tendrá que analizar el archivo XML mediante funciones genéricas para elementos y atributos, sino más bien a través de los campos reales que tienen sentido para su problema.

Por supuesto, para poder detectar la presencia de la misma entrada en ambos archivos, tendrá que "emparejarlos" a través de un campo común (por ejemplo, algunos ID).

para ayudarle con el proceso de detección de duplicados que podría utilizar algún tipo de estructura de datos relevantes a partir de colecciones de Java, al igual que el Set (o uno de sus derivados)

espero que esto ayude.

1

El enfoque correcto depende de dos factores:

(a) ¿Cuánto control desea obtener más de cómo se realiza la comparación? Por ejemplo, ¿necesita controlar si el espacio en blanco es significativo, si se deben ignorar los comentarios, si se deben ignorar los prefijos de espacio de nombres, si se deben ignorar las declaraciones de espacios de nombres redundantes, si se debe ignorar la declaración XML?

(b) ¿qué respuesta quieres? (i) un booleano: igual/diferente, (ii) una lista de diferencias adecuada para que un ser humano la procese, (iii) una lista de diferencias adecuada para que una aplicación la procese.

Las dos técnicas que uso son: (a) convertir ambos archivos a Canonical XML y luego comparar cadenas. Esto da muy poco control y solo da un resultado booleano. (b) compare los dos árboles utilizando la función deep-equal() de XPath 2.0 o la saxon de versión sajona extendida: deep-equal(). La versión sajona brinda más control sobre cómo se realiza la comparación y un informe más detallado de las diferencias encontradas (para la lectura humana, no para el uso de la aplicación).

Si desea escribir código Java, podría implementar su propia lógica de comparación, por ejemplo, podría encontrar una implementación de código abierto de XPath deep-equal y modificarla para cumplir con sus requisitos. Son solo un centenar de líneas de código.