2009-11-30 6 views
5

Je voudrais contrôler l'ordre des attributs dans les fichiers .java générés par le compilateur JAXB. Je suis conscient que l'ordre des attributs n'est pas important pour la validation xml. L'ordre est important pour la comparaison textuelle d'un fichier xml classifié dans un environnement de test de régression. L'ordre des attributs dans un fichier affecte directement l'ordre des attributs dans les balises xml.Ordre du compilateur et des attributs JAXB

Chaque fois que le compilateur JAXB est exécuté, les groupes d'attributs apparaissent dans un ordre différent, même sans modification du schéma. Il n'y a aucune option apparente disponible sur le compilateur pour empêcher ce comportement. Je souhaite éviter d'exécuter un script de post-compilation pour réordonner alphabétiquement les attributs dans les fichiers .java générés car cela interrompt les groupes d'attributs, mais je ne suis pas sûr qu'il existe une autre option.

Toutes les suggestions sont très appréciées.

Merci, Dave

Répondre

0

Ce thread fournit une excellente solution à mon problème.

Using XSL to sort attributes

L'une des réponses contient une transformation XSL qui vient réordonne les attributs. Fonctionne parfaitement si un peu lent.

1

Je vous recommande d'utiliser un analyseur XML pour valider la sortie au lieu de faire des comparaisons textuelles. Si vous voulez analyser le XML pour le réorganiser de toute façon, vous pouvez aussi faire la comparaison en utilisant des outils XML.

Modifier: Tenter de contrôler le code XML généré en manipulant l'ordre du code source Java semble être une manière fragile de faire les choses. Accordé, ceci est pour le test seulement, donc si quelque chose casse le code pourrait fonctionner toujours correctement. Les gens changent d'ordre de code source tout le temps, parfois par accident, et ce sera ennuyeux ou une source subtile de problèmes si vous devez compter sur une certaine commande.

Quant aux moyens de comparer les données XML en utilisant des outils XML, je n'ai jamais personnellement fait cela à grande échelle, mais this link mentions a few free tools. Pour moi, l'extension à JUnit qui fournit des assertions XML serait ma première étape, car cela pourrait bien s'intégrer avec mes tests existants. Sinon, puisque vous recherchez principalement l'équivalence exacte, vous pouvez juste analyser les deux fichiers XML, puis parcourir les noeuds du fichier 'attendu' et voir si ces noeuds sont présents dans le fichier 'réel'. Ensuite, vérifiez simplement les autres nœuds que vous ne prévoyez pas voir.

+0

La comparaison fait partie d'un grand test de régression conduit script bash et nous n'analyse pas actuellement l'une des réponses xml. Je pourrais utiliser un outil de comparaison XML mais je n'ai aucune expérience avec eux. Je travaille dans un environnement Solaris - pouvez-vous suggérer un outil de comparaison xml qui peut être appelé à partir de la ligne de commande à cet effet? Les fichiers à comparer peuvent également ne pas être validés par rapport au schéma car certaines différences connues sont remplacées par des valeurs constantes. – daveg

+0

En outre, je pensais réorganiser les attributs dans le fichier. Java - pas la réponse XML. Je suppose que le marshaller utilise la réflexion parce que l'ordre dans le fichier .java semble contrôler directement l'ordre des attributs dans les réponses marshalled. – daveg

+0

J'ai édité ma réponse pour répondre à vos deux points. –

1

Si vous devez effectuer une comparaison textuelle de documents XML, il existe de meilleures façons de le faire qu'en essayant de contrôler la sortie d'un framework XML qui ne fait pas de distinction entre l'ordonnancement d'attributs.

Par exemple, il y a XMLUnit, qui est une extension de junit spécifiquement pour les assertions XML, et qui gère les espaces et les commandes de façon très agréable.

Une solution plus générale est XOM'sCanonicalizer, qui génère des DOM XML de sorte que l'ordre des attributs et les espaces soient prévisibles. Très utile. Alors ... laissez JAXB (ou quoi que ce soit d'autre) générer le XML comme bon lui semble, puis exécutez les sorties via XMLUnit ou XOM, et comparez. Cela a l'avantage de ne pas dépendre de JAXB, cela fonctionnera avec n'importe quel XML généré.

4

Apparemment, dans JAXB 2.0, vous pouvez utiliser le @XmlAccessorOrder d'annotation ou @XmlType (propOrder =)

Questions connexes