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 :

Comment indenter ? [FAQ] [StAX]


Sujet :

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

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut Comment indenter ?
    Bonjour,

    Je voudrais savoir si il y a un moyen de formater automatiquement un XML avec Stax.

    J'ai essayé d'utilisdf, comme préconisé dans cet article , la staxs-utils mais j'obtiens toujours tout le code généré sur une seule ligne.

    Quelqu'un sait comment utiliser la stax-utils ou tout autre moyen d'avoir un xml bien indenté avec Stax ?

  2. #2
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Regardes du côté de Stax-Utils : https://stax-utils.dev.java.net/nona...ils/index.html

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut
    Comme je l'ai dit j'ai déjà regardé.

    En remplaçant mon writer de type XMLStreamWriter par un de type StAXStreamWriter, j'obtiens toujours la sortie sur une seule ligne.

    J'ai également essayé d'implémenter XMLStreamEventWriter cependant je n'ai pas réussi à l'ajouter à une factory (seul les types XMLEventWriter et XMLStreamWriter sont acceptés).

  4. #4
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Citation Envoyé par Pouss06 Voir le message
    Comme je l'ai dit j'ai déjà regardé.
    Oups, fatigué moi.
    En plus j'ai mis le lien vers la version avec Frames, ca aide pas : https://stax-utils.dev.java.net/nona...entWriter.html

    J'ai écris ce test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		File url = new File("C:/test.xml");
     
    		XMLInputFactory factory = XMLInputFactory.newInstance();
    		XMLEventReader reader = factory.createXMLEventReader(new FileReader(url));
    		XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
    		XMLEventWriter writer = outputFactory.createXMLEventWriter(System.out);
    		writer = new IndentingXMLEventWriter(writer);
     
    		while(reader.hasNext()){
    		    writer.add(reader.nextEvent());
    		}
     
    		writer.close();
    Avec un xml sur une ligne dans "test.xml". Ca m'a bien affiché le xml formatté dans la console.

    Eric

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut
    Merci pour ta réponse

    Le problème c'est que j'utilise un XMLStreamWriter et non pas un XMLEventWriter. Or il n'existe pas de classe "IndentingXMLStreamWriter".

    Si vraiment on peut pas indenter avec un StreamWriter, je passerais à un EventWriter, même si ça n'a pas réellement de sens d'avoir un EventWriter dans mon code.

  6. #6
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Tu peux par exemple reprendre le code que je t'ai mis pour faire ce qu'on appelle la transformation identité.

    Bref tu rajoutes juste une nouvelle étape qui s'occupe de l'indentation, avec ce que tu produis actuellement en entrée de cette nouvelle étape.

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut
    J'ai essayé cette solution, cependant j'ai toujours deux problèmes:
    1. Le texte affiché dans la console est mal formaté. J'obtiens les caractères "& # 1 3 ;" (espace rajoutés) à chaque fin de ligne. Voilà un exemple de ma console:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      <?xml version='1.0' encoding='utf-8'?>
       
      <project name="Sample Project">
       
      </project>
    2. Le deuxième problème est que un XMLEventWriter ne sait pas écrire dans un fichier. J'entend par là qu'il n'a pas les méthodes: wrtieStartDocument et WriteEndDocument contrairement à XMLStreamtWriter.


    Il semblerait que que le "& # 1 3 ;" (espace rajoutés) soit le code du retour à ligne. Mais pourquoi s'affiche-t-il ?

  8. #8
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Citation Envoyé par Pouss06 Voir le message
    Le deuxième problème est que un XMLEventWriter ne sait pas écrire dans un fichier. J'entend par là qu'il n'a pas les méthodes: wrtieStartDocument et WriteEndDocument contrairement à XMLStreamtWriter.
    Je n'ai pas compris.
    Cette ligne te permet d'écrire dans un flux, non ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OutputStream monFlux = ...;
    XMLEventWriter writer = outputFactory.createXMLEventWriter(monFlux);
    Citation Envoyé par Pouss06 Voir le message
    Il semblerait que que le "& # 1 3 ;" (espace rajoutés) soit le code du retour à ligne. Mais pourquoi s'affiche-t-il ?
    Chez moi ca n'affiche pas ces caractères
    Comment est ton xml de départ ?

  9. #9
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut
    Merci Merci Merci, c'est tout bien indenté dans un fichier maintenant :-)
    Je ne connaissais pas l'existence des FileOutputStream, désolé...

    Cependant il me reste ce problème de chaine de caractère en fin de ligne.

    Ce que je donne en entré est créé par Stax (par un XmlStreamWriter dans un FileWriter). Cette première version du fichier est bien indenté.

    Ce que j'ai donné en entré dans l'exemple précédent était ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version='1.0' encoding='utf-8'?><project name="Sample Project"></project>
    Je pense que ça vient d'un problème de formatage de caractère. Cependant même en forçant Notepad++ à lire le fichier en utf-8, j'obtiens toujours ces caractères.

  10. #10
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Je n'arrive pas à reproduire ton problème. Désolé.

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut
    Ça n'a peut-être rien à voir, mais c'est peut-être du à l'OS.

    Perso je suis sous windows. Demain je testerais mon code sous Ubuntu.

    Sinon je travaille avec Eclipse mais je pense pas que ça joue.

    Merci tout de même pour ton aide

  12. #12
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut
    J'ai enfin pu tester mon plugin sous Linux (Ubuntu) et là mon XML est tout joli.
    Le problème vient donc du système d'exploitation (en l'occurrence windows) ou plutôt de l'implémentation de Stax sous Windows.

    Ce que je ne comprend pas c'est que java est indépendant de l'os...

    En tout cas, ça me conforte dans l'idée que l'api Stax n'est pas encore stable et n'a pas encore toute les fonctionnalités de bases.

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Par défaut
    J'ai testé mon projet sur un autre windows, le code est parfaitement indenté. Étant donné qu'il l'était également avec Ubuntu, celà doit venir de mon pc (je l'éspère pour l'avenir de Stax).

    Je met donc l'article en résolu, bien que lStax sur mon pc ne fonctionne pas correctement.

    Un grand merci à Ricky

  14. #14
    Invité de passage
    Inscrit en
    Février 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 1
    Par défaut IndentingXMLStreamWriter
    Bonjour,

    J'ai rencontrer le même problème récemment (j'obtenais mon xml écrit sur une seule ligne) en utilisant l'API stax-util.

    Pour résoudre ce problème, j'ai utilisé la classe IndentingXMLStreamWriter fournie avec l'API, ça agit comme un filtre qui va indenter l'écriture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //rOut est un OuputStream que j'utilise
     
    //On utilise une fabrique pour créer le flux d'écriture
    XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
    //On utilise un filtre pour indenter le texte écrit
    XMLStreamWriter writer =  new IndentingXMLStreamWriter(outputFactory.createXMLStreamWriter(rOut));
     
    writer.writeStartDocument();
    En espérant que cela puisse vous aidez, même si j'arrive longtemps après la bataille!

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

Discussions similaires

  1. Comment indenter une variable dans un "onclick" ?
    Par shadow54 dans le forum jQuery
    Réponses: 2
    Dernier message: 10/02/2010, 20h03
  2. [FAQ]Comment indenter un fichier XML
    Par SfJ5Rpw8 dans le forum Vos Contributions VBScript
    Réponses: 4
    Dernier message: 23/10/2008, 11h04
  3. Comment indenter un flux XML avant affichage ?
    Par danyboy85 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 05/12/2006, 11h30
  4. [JDevelopper] Comment indenter automatiquement le code ??
    Par Bicnic dans le forum JDeveloper
    Réponses: 5
    Dernier message: 03/08/2004, 21h11

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