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 :

Mise en forme avec JDOM


Sujet :

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

  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut Mise en forme avec JDOM
    Bonjour,

    Je souhaite mettre en forme des fichiers .xml en Java. Je souhaite avoir l’indentation pour la mise en page, voila mon code :

    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
    private String miseEnFormeXml(String xmlString) {
        try {
            SAXBuilder builder = new SAXBuilder();
            Document document = builder.build(toInputStream(xmlString));
            xmlString = documentToString(document);
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
     
        return xmlString;
    }
     
    private static InputStream toInputStream(String string) {
        return new ByteArrayInputStream(string.getBytes());
    }
     
    private static String documentToString(Document document) throws IOException {
        XMLOutputter outp = new XMLOutputter();
        outp.setFormat(Format.getPrettyFormat().setIndent("    "));
        StringWriter sw = new StringWriter();
        outp.output(document.getContent(), sw);
        return sw.getBuffer().toString();
    }
    La mise en page est bonne mais il me supprime la première ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="ISO-8859-1"?>
    Comment le forcer à la garder ?

    Merci.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    drôle d'idée d'appeler document.getContent(). Mets en forme directement document, et il te mettra une déclaration XML sans que tu aies besoin de lui demander.

    ... Par contre, ce ne sera pas la même. Il utilisera UTF-8 au lieu de ISO-8859-1.
    On ne peut pas "garder le même" juste avec JDOM. L'encodage d'un fichier XML ne fait pas partie des informations qu'il contient (c'est comme l'ordre des attributs ou le nombre d'espace dans <balise> ou <balise >.) Il n'est donc pas gardé dans l'objet Document, et on ne peut pas le retrouver.

    Si tu veux forcer le XMLOutputter à utiliser ISO-8859-1, il suffit de préciser l'encodage dans le Format. Mais JDOM ne peut pas te dire si l'encodage d'origine, c'était ça ou autre chose.


    Sinon, attention, un léger risque :
    cette ligne sert à indiquer l'encodage du fichier XML. Hors ce que tu lis et produis, ce sont des String, pas des fichiers. Et une String n'a pas d'encodage.
    Ce qui veut dire qu'en ayant cette ligne, tu décides à l'avance dans quel encodage le fichier sera encodé, mais tu ne fais pas encore cet encodage. Il y a un risque qu'au moment où tu écris la String dans un fichier, ce ne sera pas avec le même encodage qui avait été décidé plus tôt.

    Il vaut mieux ne pas manipuler des String, mais plutôt des File, Path, ou InputStream/OutputStream.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Je n'ai pas le choix que d'utiliser des String.

    J'ai voulu faire comme ici :
    http://stackoverflow.com/questions/139076/how-to-pretty-print-xml-from-java[/CODE

    mais impossible de créer l'objet DOMSource. Chez moi il prend un 'Node' en paramètre ... Je ne comprend pas.

    Merci.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pour information, on n'est jamais très convaincant quand on dit les choses alors qu'on peut les montrer quand elles sont vraies. (On ne dit pas "je n'ai pas le choix" on dit "en fait, <situation dans laquelle il n'y a pas le choix>")
    Mais peu importe, ça te regarde. Je t'ai parlé du problème, si tu vas faire avec eh bien maintenant tu le sauras.

    Concernant le DOMSource, eh bien, c'est normal que ça ne marche pas, il ne faut pas confondre DOM et JDOM. De toute façon ce bout de code ne te serait pas plus utile que JDOM ne l'est déjà.

    Bref, je t'ai tout dit, là. Ton problème est-il résolu ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Bref, je t'ai tout dit, là. Ton problème est-il résolu ?
    Non



    Citation Envoyé par thelvin Voir le message
    drôle d'idée d'appeler document.getContent(). Mets en forme directement document, et il te mettra une déclaration XML sans que tu aies besoin de lui demander.

    Je ne trouve pas d'exemples



    C'est la première fois que j'utilise cette api, si vous avez des exemples ...

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Le principe de JDOM, c'est que tu n'as pas besoin d'exemples, l'autocomplétion est plus que suffisante. Manipuler du XML à l'aide d'une bibliothèque est une suite de besoin évidents et JDOM les comble de façon évidente.

    Lorsque tu n'es pas sûr avec l'autocomplétion, ou si tu n'en as pas (dans ce cas, arrête tout de suite et apprends d'abord à utiliser Eclipse ou Netbeans,) tu peux simplement regarder la Javadoc de JDOM. Notamment la page de XMLOutputter.

    On y constate que tu pouvais faire outp.output(document, sw); . Et aussi que tu pouvais faire return outp.outputString(document); sans Writer.
    (En fait, je me demande où tu as trouvé un exemple qui puisse supposer qu'appeler document.getContent() soit une bonne idée. Ce n'est là que pour des cas de niche qu'on ne voit jamais.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Ce code fonctionne :

    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
    private static String miseEnFormeXml(String xmlString) {
        try {
            SAXBuilder builder = new SAXBuilder();
            Document document = builder.build(toInputStream(xmlString));
            xmlString = documentToString(document);
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
     
        return xmlString;
    }
     
    private static InputStream toInputStream(String string) {
        return new ByteArrayInputStream(string.getBytes());
    }
     
    private static String documentToString(Document document) throws IOException {
        XMLOutputter outp = new XMLOutputter();
        outp.setFormat(Format.getPrettyFormat().setIndent("    ").setEncoding("ISO-8859-1"));
        return outp.outputString(document);
    }
    mais je souhaiterai récupérer directement l'encodage à partir du xml, du type document.getXMLEncoding(). Je ne trouve pas de méthode pour le faire ...

    Merci.

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Effectivement, comme je l'ai déjà dit, JDOM ne le fera pas pour toi.
    Nous sommes dans l'un des rares cas où le DOM natif de Java est plus utile que JDOM, parce que lui peut fournir l'encodage indiqué dans la déclaration XML.

    Ça ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new InputSource(new StringReader(xmlString)));
     
    String encoding = document.getXmlEncoding();
    System.out.println(encoding);
    Après, pour la mise en forme, tu peux utiliser le code que tu avais déjà trouvé avec Transform.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [Cookies] mise ne forme avec cookies
    Par Tee shot dans le forum Langage
    Réponses: 3
    Dernier message: 04/06/2007, 22h39
  2. Probleme de mise en forme avec DIV et CSS
    Par freesurfer dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 09/02/2007, 15h26
  3. [WebForms][2.0] Mise en forme avec du css
    Par kakid dans le forum Général Dotnet
    Réponses: 12
    Dernier message: 26/01/2006, 18h49
  4. Mise en forme avec Netscape et Mozilla
    Par seb30 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 18/10/2004, 10h18

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