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 :

Garder espaces dans fichier xml et indentation xml


Sujet :

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

  1. #1
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 241
    Par défaut Garder espaces dans fichier xml et indentation xml
    Bonjour,

    Voici la fonction suivante qui génére un fichier xml à partir d'un Document :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    public void printDocument(String path, Document doc, String encoding) throws OdXmlException 
        {
                     
            DOMImplementation domImplementation = doc.getImplementation();
            
            PrintWriter out = null;
            File f= null;
            try {  
                try {
                    
                    if (isValidJavaEncoding(encoding)) {
                        f = new File(path);
                        out = new PrintWriter(f, encoding);
                    }
                    else {
                        f = new File(path);
                        out = new PrintWriter(f, OdXmlUtil.DEFAULT_ENCODING);
                        encoding = OdXmlUtil.DEFAULT_ENCODING;
                    }            
    
                    if (domImplementation.hasFeature("LS", "3.0") && domImplementation.hasFeature("Core", "2.0")) {
                        DOMImplementationLS domImplementationLS = (DOMImplementationLS) domImplementation.getFeature("LS", "3.0");
                        LSSerializer lsSerializer = domImplementationLS.createLSSerializer();
                        DOMConfiguration domConfiguration = lsSerializer.getDomConfig();
                        
                        
                        
                        if (domConfiguration.canSetParameter("format-pretty-print", Boolean.TRUE)) {
                            lsSerializer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
                            
                        }
                        
                        if (domConfiguration.canSetParameter("element-content-whitespace", Boolean.TRUE)) {
                            lsSerializer.getDomConfig().setParameter("element-content-whitespace", Boolean.TRUE);
                            
                        }
                        
                        
                        
                        LSOutput lsOutput = domImplementationLS.createLSOutput();
                        lsOutput.setEncoding(encoding);
                        lsOutput.setCharacterStream(out);
                        lsSerializer.write(doc, lsOutput);
                        
                        
                        
                    } else {
                        throw new RuntimeException("DOM 3.0 LS and/or DOM 2.0 Core not supported.");
                    }
                    
                    out.flush();
                    
    
                }
                finally {
                    if (f != null) {
                        f= null;
                    }
                    if (out != null) {
                        out.close();
                    }
                }
            }
            catch (Exception e) {  
               ...
            }
            
        }
    Quand j'ai un texte ne contenant que des espaces (par exemple : 4 espaces contigus), je désire que la balise <text> du fichier xml s'écrive :

    <text> </text>
    ... et non :
    <text/>
    Quand je retire le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (domConfiguration.canSetParameter("format-pretty-print", Boolean.TRUE)) {
                            lsSerializer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
                            
                        }
    ... la balise est bien :

    <text> </text>
    ... mais alors le fichier xml n'inclus plus l'indentation liée aux balises xml.

    Comment résoudre ce problème ?

    Merci d'avance.

    A+

  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
    On ne peut pas à la fois garder les espaces tels que, et faire de l'auto-indentation, c'est contradictoire.

    Une solution que j'aime bien, remplacer tous les espaces que je veux conserver par un caractère spécial genre espace insécable ou idéogramme du soleil (xpath sur les nœuds texte à garder tels quels, et remplacement du contenu,) écriture avec pretty-print dans une chaîne, parsing de la chaîne dans un nouveau document XML, remplacement du caractère spécial par des espaces normaux, écriture sans pretty-print.

    Un peu laborieux pour la machine, mais très simple pour nous.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 241
    Par défaut
    Citation Envoyé par thelvin Voir le message
    On ne peut pas à la fois garder les espaces tels que, et faire de l'auto-indentation, c'est contradictoire.
    Mais si au premier abord cela semble contradictoire, l'indentation est réalisée grâce aux espaces qui se trouvent après des balises fermantes, alors que les caractères espaces à ne pas retirer se trouvent après des balises ouvrantes. Donc cela devrait être possible, non ?

    Citation Envoyé par thelvin Voir le message
    Une solution que j'aime bien, remplacer tous les espaces que je veux conserver par un caractère spécial genre espace insécable ou idéogramme du soleil (xpath sur les nœuds texte à garder tels quels, et remplacement du contenu,) écriture avec pretty-print dans une chaîne, parsing de la chaîne dans un nouveau document XML, remplacement du caractère spécial par des espaces normaux, écriture sans pretty-print.

    Un peu laborieux pour la machine, mais très simple pour nous.
    J'ai bien pensé à ce type de traitement sauf que les fichiers xml générés doivent répondre à des normes protocolaires liées aux courant très hautes tensions. Donc ici c'est peu probable que cette solution soit adopté par le service informatique.

    A+

  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
    Citation Envoyé par Mister Nono Voir le message
    Mais si au premier abord cela semble contradictoire, l'indentation est réalisée grâce aux espaces qui se trouvent après des balises fermantes, alors que les caractères espaces à ne pas retirer se trouvent après des balises ouvrantes.
    ?
    Des espaces d'indentation sont forcément compris, au moins entre les balises fermantes et ouvrantes de l'élément racine, et en général de bien d'autres... Ça marche pas, ton truc.

    Citation Envoyé par Mister Nono Voir le message
    Donc cela devrait être possible, non ?
    C'est toujours possible, mais quand on se plonge dans l'étude de la chose on voit que ce qu'on cherche à faire dépend... De ce qu'on cherche à faire. Ce n'est pas universel, ça dépend de ce qui est "plus joli" dans le format précis qu'on est en train d'utiliser. Il n'y a pas une norme à favoriser par rapport aux autres. Et donc, pas de convention "pretty-print qui conserve les espaces" n'a été universellement choisie.

    On pourrait mettre en place une norme de définition du pretty-print qui ne s'applique pas ou s'applique avec contraintes sur certains éléments, définis par exemple avec un xPath ou un pattern match. Mais à ma connaissance ce n'est implémenté nulle part en standard et il faut le programmer soi-même. À mon avis, le plus rapide, c'est comme je l'ai expliqué.
    En JDOM, il y a plus sûr et assez rapide, c'est de carrément étendre les classes du XMLOutputter en pretty-print pour se comporter pile-poil comme on le veut.

    Citation Envoyé par Mister Nono Voir le message
    J'ai bien pensé à ce type de traitement sauf que les fichiers xml générés doivent répondre à des normes protocolaires liées aux courant très hautes tensions. Donc ici c'est peu probable que cette solution soit adopté par le service informatique.
    En remplaçant le "caractère spécial" par un élément <sp:preserve-space xmlns:sp="http://preserve-space.sp"/>, je ne vois pas quel problème se pose. Mais je te crois sur parole.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [POI] Reconnaissance espaces dans fichier xls
    Par NoxXx73 dans le forum Documents
    Réponses: 0
    Dernier message: 23/06/2011, 10h08
  2. Problème espace dans fichier
    Par slockstone dans le forum Linux
    Réponses: 2
    Dernier message: 16/12/2008, 23h02
  3. Pb de balises dans fichier XML
    Par allstar dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/06/2005, 13h59
  4. xml->html : retour chariot, espaces dans un div
    Par d'Oursse dans le forum XML/XSL et SOAP
    Réponses: 9
    Dernier message: 27/04/2004, 19h13
  5. [debutant] preservation des espace dans un fichier xml
    Par Eric B dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 03/09/2003, 09h43

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