2009-11-30 16 views
5

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

Soy consciente de que el orden de los atributos no es importante para la validación de xml. El orden es importante para la comparación textual de xml marshalled 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 compiladas.

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 un script de compilación posterior para reordenar alfabéticamente los atributos en los archivos .java generados, ya que esto desglosa los grupos de atributos, pero no estoy seguro de que haya otra opción.

Cualquier sugerencia es muy apreciada.

Gracias, de Dave

Respuesta

0

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

Using XSL to sort attributes

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

1

le recomiendo usar un analizador XML para validar la salida en lugar de hacer comparaciones textuales. Si va a analizar el xml para volver a ordenarlo 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 ser 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 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 depender de un determinado pedido.

En cuanto a formas de comparar los datos XML utilizando herramientas XML, nunca he hecho esto personalmente en gran escala, pero this link mentions a few free tools. 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, como busca principalmente la equivalencia exacta, podría 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 'actual'. Luego solo busca cualquier otro nodo que no esperas ver.

+0

La comparación es parte de una prueba de regresión guión impulsado fiesta grande y que actualmente no están parseando cualquiera de las respuestas XML. Podría usar una herramienta XML diff pero no tengo ninguna experiencia con ellos. Estoy trabajando en un entorno Solaris: ¿puede sugerir una herramienta xml diff que se pueda invocar desde la línea de comandos para este fin? También es posible que los archivos que se comparen no validen en relación con el esquema porque ciertas diferencias conocidas se sustituyen por valores constantes. – daveg

+0

Además, estaba considerando reordenar los atributos en el archivo .java, no la respuesta xml. Supongo que el Marshaller utiliza la reflexión porque el orden en el archivo .java parece controlar directamente el orden de los atributos en las respuestas ordenadas. – daveg

+0

Edité mi respuesta para abordar sus dos puntos. –

1

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

Por ejemplo, está XMLUnit, que es una extensión junit específicamente para aserciones XML, y maneja espacios en blanco y ordena bastante bien.

Una solución más general es XOM'sCanonicalizer, que genera XML DOM de forma 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 lo considere oportuno, luego ejecute los resultados a través de XMLUnit o XOM, y compare. Esto tiene la ventaja adicional de no depender de JAXB, funcionará con cualquier XML generado.

4

Al parecer, en JAXB 2.0 se puede utilizar el @XmlAccessorOrder anotación o @XmlType (propOrder =)