Pregunta

Me gustaría controlar el orden de los atributos en los archivos .java generados por el compilador JAXB.

Soy consciente de que el orden de los atributos no es importante para la validación xml. El orden es importante para la comparación textual de xml ordenado en un entorno de prueba de regresión. El orden de los atributos en un archivo afecta directamente el orden de los atributos en las etiquetas XML ordenadas.

Cada vez que se ejecuta el compilador JAXB, los grupos de atributos aparecen en un orden diferente, incluso sin cambios en el esquema. No hay una opción aparente disponible en el compilador para evitar este comportamiento.

Me gustaría evitar ejecutar una secuencia de comandos posterior a la compilación para reordenar alfabéticamente los atributos en los archivos .java generados, ya que esto divide los grupos de atributos, pero no estoy seguro de que haya otra opción.

Cualquier sugerencia es muy apreciada.

Gracias Dave

¿Fue útil?

Solución 4

Este hilo proporciona una gran solución a mi problema.

Uso de XSL para ordenar los atributos

Una de las respuestas contiene una transformación xsl que solo reordena los atributos. Funciona perfectamente si es un poco lento.

Otros consejos

Aparentemente, en JAXB 2.0 puede usar la anotación @XmlAccessorOrder o @XmlType (propOrder =)

Recomiendo usar un analizador XML para validar la salida en lugar de hacer comparaciones textuales. Si va a analizar el xml para reordenarlo de todos modos, también puede hacer la comparación utilizando herramientas XML.

Editar: Intentar controlar el XML generado manipulando el orden del código fuente de Java parece una forma frágil de hacer las cosas. De acuerdo, esto es solo para pruebas, por lo que si algo se rompe, el código aún podría funcionar correctamente. Las personas cambian el orden del código fuente todo el tiempo, a veces por accidente, y será molesto o una fuente sutil de problemas si tiene que confiar en cierto orden.

En cuanto a las formas de comparar los datos XML utilizando herramientas XML, nunca lo he hecho personalmente a gran escala, pero este enlace menciona algunas herramientas gratuitas . Para mí, la extensión a JUnit que proporciona aserciones relacionadas con XML sería mi primer paso, ya que podría integrarse bien con mis pruebas existentes. De lo contrario, dado que está buscando principalmente la equivalencia exacta, puede analizar los dos archivos XML, luego iterar sobre los nodos en el archivo 'esperado' y ver si esos nodos están presentes en el archivo 'real'. Luego, compruebe si hay otros nodos que no espera ver.

Si necesita realizar una comparación textual de documentos XML, hay mejores formas de hacerlo que tratando de controlar la salida de un marco XML que no distingue entre el orden de los atributos.

Por ejemplo, hay XMLUnit , que es una extensión de junit específicamente para aserciones XML, y maneja espacios en blanco y ordenando muy bien.

Una solución más general es XOM's Canonicalizer , que genera DOM XML de modo que el orden de los atributos y el espacio en blanco sean predecibles. Muy útil.

Entonces ... deje que JAXB (o lo que sea) genere el XML como mejor le parezca, luego ejecute las salidas a través de XMLUnit o XOM, y compare. Esto tiene la ventaja adicional de no depender de JAXB, funcionará con cualquier XML generado.

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