IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Comparer 2 fichiers XML


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet sur HPC
    Inscrit en
    Août 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet sur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 27
    Points : 19
    Points
    19
    Par défaut Comparer 2 fichiers XML
    Salut,

    Je tente de comparer 2 fichiers XML dans le cadre de mes tests Junit.

    J'utilise JAXB pour générer mon XML vers la console, ensuite je copie/colle dans Notepad++ et je sauve mon fichier (qui est donc mon fichier de référence).

    Ensuite, j'écrit le même XML mais directement dans un fichier et je tente de comparer les 2.

    Si le compare les 2 fichiers avec Araxis_Merge.exe ils sont identiques (mais l'éditeur me reformate le 2ème fichier avec les sauts de lignes).

    Prb : la méthode FileUtils.contentEquals(file1, file2) me renvoie false.

    Je tente donc avec XMLUnit.compareXML(xml1, xml2) qui est plus adapté pour le XML mais c'est pareil !

    Après avoir passé mon après midi, je pense que je deviens aveugle...

    Donc si vous avez une solution simple pour m'en sortir je suis preneur !

    Merci.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par SuperJoker Voir le message
    Prb : la méthode FileUtils.contentEquals(file1, file2) me renvoie false.
    Normal, ne serait-ce que sur les conventions de fin de ligne, et éventuels espaces au début ou à la fin.

    Citation Envoyé par SuperJoker Voir le message
    Je tente donc avec XMLUnit.compareXML(xml1, xml2) qui est plus adapté pour le XML mais c'est pareil !
    Effectivement, pour ce qui est de s'adapter il fait pas semblant. Mais il a des logiques un peu bizarres, comme similar() et identical() qui ignorent ou tiennent compte de l'ordre des éléments et des attributs. En XML l'ordre des attributs ne compte jamais, et l'ordre des éléments compte toujours. Bizarre donc.
    En tout cas il est configurable, et notamment, tenir compte de l'ordre des attributs peut être désactivé.

    Tu ne nous as pas montré les deux fichiers, ni comment tu les génères, alors c'est difficile de deviner où sont les différences.
    Mais après analyse rapide de ce que font XMLUnit et Araxis_Merge, j'ai deux suspects :
    - l'ordre des attributs. Sérieusement, XMLUnit fait n'importe quoi, là. il faut le configurer à false bien sûr, et ce n'est pas par défaut.

    - ignorer l'indentation (les whitespaces.) En XML il est fréquent d'indenter avec des sauts de lignes et des espaces, qui ne comptent pas. Mais il arrive que certains espaces doivent compter, comme avec le <pre> de HTML. "XML" en général ne peut pas deviner si c'est l'un ou l'autre, c'est l'implémentation du format qui s'occupe de le savoir. Vu que dans le monde réel on a rarement besoin de comparer deux documents XML, ce n'est pas souvent un problème.
    Par défaut, XMLUnit considère que les espaces comptent, ce qui est peu probable mais évite de se tromper. Et Araxis_Merge considère qu'ils ne comptent pas, ce qui est en général ce qu'on veut, mais au risque de se tromper quand c'est pas le cas.
    Il suffit d'utiliser setIgnoreWhitespace(true) pour XMLUnit.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef de projet sur HPC
    Inscrit en
    Août 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet sur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Extrait de ma classe de génération du XML (GenererXML) :

    JAXBContext context = JAXBContext.newInstance(Rapport.class);
    JAXBElement<Rapport> outXML = fabrique.createRapport(rapport);
    Marshaller marshaller = context.createMarshaller();

    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

    marshaller.marshal(outXML, System.out);
    Le XML s'écrit donc dans la console, que je copie/colle dans Notepad++ ce qui donne ce fichier :

    Nom : ref.png
Affichages : 1429
Taille : 89,3 Ko


    Dans ma classe Junit, je fait appel à la classe précédente (GenererXML) mais cette fois ci je redirige la console vers un fichiers (c'est la solution que j'ai trouvé car Junit ne sais lire directement la console)

    PrintStream printStream = new PrintStream(resultatXML);
    System.setOut(printStream);

    GenererXML ficXML = new GenererXML();
    ficXML.creationXML(fabrique, rapport);
    Le fichier généré ouvert sous Bloc-Note :
    Nom : out.png
Affichages : 1418
Taille : 116,2 Ko

    Ma classe de comparaison des XML :

    xml1 = new FileReader("C:\\k0ecn1_vehic_opshape_x4_sol108.xml");
    xml2 = new FileReader("C:\\out.xml");

    XMLUnit.setIgnoreWhitespace(true);
    XMLUnit.setIgnoreComments(true);
    XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true);
    XMLUnit.setNormalizeWhitespace(true);

    assertEquals(true, XMLUnit.compareXML(xml1, xml2));
    Donc voilà, où j'en suis : ça semble tellement bête comme problème que c'est vraiment agaçant !!!

    Est-ce ma redirection de la console vers un fichier qui pose problème ?

    Voili, voilà

    Merci de votre aide

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par SuperJoker Voir le message
    Est-ce ma redirection de la console vers un fichier qui pose problème ?
    Eh bien, je ne te vois pas fermer le fichier en question, donc ça pourrait bien être un problème, oui.

    Mais c'est plutôt l'idée de copier/coller une sortie console dans un fichier, qui cherche les ennuis autant que possible. Il y a cette histoire de conventions de fin de lignes, et je vois aussi que tu as des accents et des œ.
    Au passage je comprends même pas comment tu as fait pour obtenir des accents corrects dans une console Windows. Mais le truc c'est qu'en copiant/collant du texte, tu perds l'information de son encodage, et là en gros tout peut arriver.

    Ensuite je vois que dans le deuxième cas, les œ ne passent pas, bien que les é passent. Comment est-ce possible, alors là ça peut venir de tout et de rien, peut-être que les œ ne passent jamais, peut-être qu'ils ne passent que dans un cas, aucune idée, il aurait fallu le montrer.

    Quitte à mettre des pièces jointes, mettre les fichiers en pièce jointes aurait été pas mal aussi. On aurait pu regarder leur encodage réel et ce qu'ils contiennent vraiment.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Effectivement, rediriger la console, c'est chercher les emmerdes. Je reverrais plutot ton api de génération pour qu'elle envoie le fichier ailleurs, genre dans un OutputStream plutôt que vers la console. Quelque chose me dit que, en prod, tu ne voudra de toute façon pas polluler la console avec ton xml


    Genre:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ByteArrayOutputStream aTester = new ByteArrayOutputStream();
    GenererXML ficXML = new GenererXML(aTester);
    ficXML.creationXML(fabrique, rapport);
    En utilisant des OutputStream, cela tévitera de bidouiller la console et les soucis d'encodage.
    Et pour la comparaison:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    xml1 = new InputSource(new FileInputStream("C:\\k0ecn1_vehic_opshape_x4_sol108.xml"));
    xml2 = new InputSource(new ByteArrayInputStream(aTester.toByteArray()));
     
    XMLUnit.setIgnoreWhitespace(true);
    XMLUnit.setIgnoreComments(true);
    XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true);
    XMLUnit.setNormalizeWhitespace(true);
     
    assertEquals(true, XMLUnit.compareXML(xml1, xml2));
    Même remarque, en utilisant des inputstream plutot que des reader, ça t'évitera les problèmes d'encodage.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef de projet sur HPC
    Inscrit en
    Août 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet sur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Désolé pour le retour tardif mais je m'en suis sorti en ne formattant pas le fichier xml (donc tout est écrit sur une seule ligne). En fait ce ce XML ne me sert que pour les tests donc ça permettra de vérifier les non régressions en cas de modification.

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] comparer 2 fichiers xml
    Par ben7875 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 26/06/2011, 14h32
  2. Comparer deux fichiers XML - un local et un externe
    Par gtraxx dans le forum Langage
    Réponses: 6
    Dernier message: 14/12/2009, 11h46
  3. outils pour comparer deux fichiers xml
    Par donny dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 17/03/2008, 20h06
  4. Réponses: 1
    Dernier message: 10/09/2006, 16h09
  5. [JDOM] Comparer deux fichiers XML en Java
    Par calimero2611 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 30/06/2006, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo