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 :

Créer un fichier XML indenté [DOM]


Sujet :

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

  1. #1
    Membre habitué Avatar de phoebe
    Inscrit en
    Août 2003
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 289
    Points : 143
    Points
    143
    Par défaut Créer un fichier XML indenté
    j'utilise le bout de code qui est dans la FAQ pour modifier mon fichier XML mais même en mettant la ligne ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    transformeur.setOutputProperty(OutputKeys.INDENT, "yes");
    les nouvelles balises que je crée ne sont pas indentées correctement...

    y a t il autre chose à préciser pour avoir une bonne indentation ?

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    De memoire, j'avais eu le meme probleme, et il me semble que tu ne peux pas indenter automatiquement.


    --
    Bicnic.

  3. #3
    Membre habitué Avatar de phoebe
    Inscrit en
    Août 2003
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 289
    Points : 143
    Points
    143
    Par défaut
    bah c'est rassurant ça...

  4. #4
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 50
    Points : 58
    Points
    58
    Par défaut
    Salut,

    le truc, c'est que pour le XML, l'indentation ne signifie rien du tout, c'est juste de l'esthétique quand quelqu'un regarde le fichier ... bref, en as-tu réellement besoin ?

    Seb

  5. #5
    Membre actif Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Points : 266
    Points
    266
    Par défaut
    ben je suppose que si Phoebe veut indenter son fichier c pasque il doit être lu non? :-D

  6. #6
    Membre actif Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Points : 266
    Points
    266
    Par défaut
    et, désolé mais je ne sais pas non plus comment faire... g essayé avec un xslt et la balise : <xsl:output method="xml" indent="yes" /> mais ça ne fait que "mettre à la ligne" chaque balise, sans effectuer de réelle indentation...

  7. #7
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 50
    Points : 58
    Points
    58
    Par défaut
    pour avoir une réelle indentation, une solution consisterait en :
    1) lire le fichier XML
    2) détecter les début et fin de tags (via SAX par exemple)
    3) de réécrire le fichier en gérant l'indentation

    Seb

  8. #8
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Pense à JDOM ! http://www.jdom.org

    cela fait des fichiers XML de grande qualité, indenté et touti quanti.....

    cela permet aussi d'extraire toutes les infos d'un fichier en un seul appel de méthode, en utilisant SAX ou DOM...

    Bref j'ai découvert ça y'a pas longtemps et je le trouve super !

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  9. #9
    Membre habitué Avatar de phoebe
    Inscrit en
    Août 2003
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 289
    Points : 143
    Points
    143
    Par défaut
    merci à tous,
    je connaissais l'existence de JDOM mais ça m'embête de devoir tout réécrire..
    je vais voir ça avec mon Boss

    encore merci !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Ouai, au point ou jen suis, je peux changer de méthode, alors why not?

    Sauf que jai besoin dafficher mon arbre.
    Avant de changer, je voudrais savoir si JDOM est capable dafficher larbre en question (seulement les éléments)?
    Et je préfèrerais que ce soit via un JTree. Cest possible, de façon simple et rapide?

    Eh Pill_S, tu naurais pas dactions chez eux par hasard

  11. #11
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par phoebe
    mais ça m'embête de devoir tout réécrire...
    d'après moi, en utilisant JDOM, ce sera plutôt du code à enlever qu'a ajouter

    Eh Pill_S, tu naurais pas dactions chez eux par hasard
    euh non... mais cela fait quelques temps que je me penche sur XML, et après avoir essayer plusieurs méthode (DOM, SAX, jaxp, xalan,...) je suis tombé sur JDOM, qui simplifie vraiment la tâche comparé à ses autres rivaux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // parser un fichier xml
    Document doc = new SAXBuilder().build(monfichierxml);
     
    // recupere la racine
    Element root = doc.getRootElement();
     
    // recupere un attribut d'un des enfants
    Attribute att = root.getChild("enfant1").getAttribute("attrib1");
    voilà, un jeu d'enfant !

    autant reconnaitre les bons logiciels lorsqu'il y en a !
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    d'après moi, en utilisant JDOM, ce sera plutôt du code à enlever qu'a ajouter
    OUai, tu as raison.
    Pour ce qui est de la contruction, cest vrai que cest nickel.
    Peux-tu me dire comment jenregistre mon arbre maintenant?
    Et ya aussi la question du JTree. En utilisant DOM, javais fais ce qui fallait pour.
    Avec JDOM, jai limpression que je vais devoir mettre certains de mes Element dans des Node pour contruire mon JTree.

  13. #13
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par mouloude
    Peux-tu me dire comment jenregistre mon arbre maintenant?
    euh bah pas plus que ça....

    en bidouillant des boucles imbriqueés, tu devrais pouvoir passer en revue tous les attributs et tous les childs (peut-être avec une méthode récursive ?) mais j'en sais pas plus....

    Si tu trouve quelque chose de spécifique à JDOM pour créer un JTree à partir d'un Document, et bien je suis preneur !
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Finalement jai trouvé.
    Non tinquiètes, pas la solution miracle mais la manière de faire.
    Pas trop compliqué, à limage de JDOM.

    Pour ce qui est denregistrer, cest plutôt pas compliqué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private import org.jdom.Document JDOMdocXML;
    ...
    private void enregJDOM(String nomFichier) {
      try {
        FileOutputStream outStream= new FileOutputStream(nomFichier);
        XMLOutputter serializer= new XMLOutputter();
        serializer.output(JDOMdocXML, outStream);
        outStream.flush(); outStream.close(); }
        catch(IOException e) {
          System.err.println(e); } }
    Si javais plus de temps je ferais bien un ptit tuto mais franchement il me manque et je débute en Java.
    ET...je suis donc bien daccord avec toi, JDOM est une solution à bien des besoins.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 73
    Points : 66
    Points
    66
    Par défaut
    Bonjours,
    en fait pas besoin d'utiliser JDom il manquais tout simplement cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    transfac.setAttribute("indent-number", new Integer(4));

    Voilà donc le code complet pour indenter un document XML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import org.w3c.dom.*;
    import org.w3c.dom.Node;
    import javax.xml.parsers.*;
    import javax.xml.transform.*;
    import javax.xml.transform.dom.*;
    import javax.xml.transform.stream.*;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    //set up a transformer
            TransformerFactory transfac = TransformerFactory.newInstance();
            transfac.setAttribute("indent-number", new Integer(4));
            Transformer trans =null;
    		try {
    			trans = transfac.newTransformer();
    		} catch (TransformerConfigurationException e) {
    			e.printStackTrace();
    		}
            trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
            trans.setOutputProperty(OutputKeys.INDENT, "yes");
     
            //create string from xml tree
            StringWriter sw = new StringWriter();
            StreamResult result = new StreamResult(sw);
            DOMSource source = new DOMSource(doc);
            try {
    			trans.transform(source, result);
    		} catch (TransformerException e) {
    			e.printStackTrace();
    		}
            String xmlString = sw.toString();
    Alors Merci qui???

    Pensez au tag

  16. #16
    Membre du Club Avatar de Raphael_Lemaire
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 66
    Points
    66
    Par défaut
    Hello.

    Cette solution fonctionne très bien dans un petit main mais pas dans mon conteneur préféré (JBoss).

    Cela vient du fait que l'implémentation de TransformerFactory est différente (org.apache.xalan.processor.TransformerFactoryImpl en l'occurence) et que celle-ci ne reconnaît pas l'attribut "indent-number". j'ai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Caused by: java.lang.IllegalArgumentException: Non pris en charge : indent-number 
    at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:574)
    Quelqu'un aurait-il une solution qui fonctionne partout (à part un gros remplacement de chaine de barbare) ?
    "Le sage ne compte pas les gouttes de la cascade, il cherche pourquoi l'eau désire retrouver la terre."

  17. #17
    Membre du Club Avatar de Raphael_Lemaire
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 66
    Points
    66
    Par défaut
    Bon j'ai trouvé tout seul.

    Il y a une solution sur le forum de sun.

    L'idée est d'utiliser une feuille XSLT pour ajouter l'indentation. Celà oblige à ajouter une ressource au projet malheuresement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!DOCTYPE stylesheet [
      <!ENTITY cr "<xsl:text>
    </xsl:text>">
    ]>
     
    <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:xalan="http://xml.apache.org/xslt" 
        version="1.0">
     
        <xsl:output method="xml" indent="yes" xalan:indent-amount="3"/> 
     
        <!-- copy out the xml -->
        <xsl:template match="* | @*">
            <xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates/></xsl:copy>
        </xsl:template>
     
    </xsl:stylesheet>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class IndentXml {
        public static String indent(String xmlSource) {
            StringWriter sw = new StringWriter();
            try {
                StreamSource stylesource = new StreamSource(FileUtils.openResource("indent.xsl"));
     
                TransformerFactory tFactory = TransformerFactory.newInstance();
                Transformer transformer = tFactory.newTransformer(stylesource);
                transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
     
                DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
                DocumentBuilder constructeur = fabrique.newDocumentBuilder();
                Document document = constructeur.parse(new ByteArrayInputStream(xmlSource.getBytes()));
                DOMSource source = new DOMSource(document);
     
                StreamResult result = new StreamResult(sw);
     
                transformer.transform(source, result);
     
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            String xmlString = sw.toString();
            System.out.println(xmlString);
            return xmlString;
        }
    }
    "Le sage ne compte pas les gouttes de la cascade, il cherche pourquoi l'eau désire retrouver la terre."

  18. #18
    Membre du Club Avatar de Raphael_Lemaire
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 66
    Points
    66
    Par défaut
    On peut mettre la XSL directement dans la classe pour éviter d'ajouter un fichier de ressource :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private static final String XSL =
            "<!DOCTYPE stylesheet [" +
            " <!ENTITY cr \"<xsl:text>" +
            "</xsl:text>\">" +
            "]> " +
            "<xsl:stylesheet" +
            "    xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" " +
            "    xmlns:xalan=\"http://xml.apache.org/xslt\"  " +
            "    version=\"1.0\">" +
            "    <xsl:output method=\"xml\" indent=\"yes\" xalan:indent-amount=\"4\"/>" +
            "    <xsl:template match=\"* | @*\">" +
            "        <xsl:copy><xsl:copy-of select=\"@*\"/><xsl:apply-templates/></xsl:copy>" +
            "    </xsl:template>" +
            "</xsl:stylesheet>";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StreamSource stylesource = new StreamSource(new ByteArrayInputStream(XSL.getBytes()));
    "Le sage ne compte pas les gouttes de la cascade, il cherche pourquoi l'eau désire retrouver la terre."

  19. #19
    Membre confirmé Avatar de ruscov
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Points : 500
    Points
    500
    Par défaut
    hello,

    le doc vient d'où?
    Mes logiciels n’ont jamais de bug. Ils développent juste certaines fonctions aléatoires.

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 34
    Points
    34
    Par défaut
    Pour indenter avec JDOM:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String xmlIndent = new XMLOutputter(Format.getPrettyFormat()).outputString(doc);

    Martin Magakian

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

Discussions similaires

  1. Créer un fichier XML grâce à du PHP
    Par Melekitto dans le forum Langage
    Réponses: 1
    Dernier message: 01/06/2006, 19h51
  2. [DOM] Créer un fichier XML sous une forme bien précise
    Par LaseLiep dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 09/06/2005, 18h05
  3. [C#] [XML] Comment créer un fichier XML
    Par pc152 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 28/09/2004, 13h41
  4. [C#] Créer un fichier Xml à partir d'un objet
    Par Troopers dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/09/2004, 13h23
  5. [DOM] est ce qu'on peut créer un fichier xml en java ?
    Par miloud dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 21/01/2004, 10h40

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