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

XML/XSL et SOAP Discussion :

Serialiser de gros documents XML


Sujet :

XML/XSL et SOAP

  1. #1
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut Serialiser de gros documents XML
    Bonjour,

    Mon problème est le suivant :

    Je dois écrire du code qui génère, dans un fichier, un gros document XML (plusieurs dizaines de Mo). La seule solution que je vois pour l'instant, c'est de générer un gros arbre DOM puis de le serialiser à l'aide d'un objet DOMWriter.

    Toutefois je suppose que cette solution est assez lourde du point de vue mémoire (en effet, on commence par construire l'ensemble de l'arborescence en mémoire; et seulement ensuite on l'écrit dans le fichier); et je me demandais s'il n'y avait pas moyen de générer mon fichier "à la volée" (comme quand on écrit dans une stream).

    Voilà, j'attend vos réponses éclairées.


    PS : j'utilise Xerces C++.

  2. #2
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    Un arbre DOM, du fait de sa structure arborescente, est consommateur en mémoire et peut occuper 10 fois la taille du fichier XML sur disque.Cependant un arbre DOM est utile pour la recherche et la modification d'un document XML de manière très performante mais n'est pas recommandé pour la simple sérialisation, puisque tu transformes l'intégralité de tes données, probablement structurées d'une facon arborescente ou composite, en une autre structure arborescente.D'ou le gaspillage de mémoire. Il vaut mieux effectivement parcourir récursivement ta structure arborescente en écrivant directement dans un flux de sortie sur fichier les balises ouvrantes+attributs, le texte et les balises fermantes. (attention à choisir un flux bufferisé pour améliorer les perfs sans consommer trop de mémoire)

    Cependant de cette facon, tu dois gérer l'encoding et éventuellement l'indentation si ton document doit être éditer à la main (mais plusieurs Mo ca m'étonnerait).

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 27
    Points : 21
    Points
    21
    Par défaut
    Je t'ai peut être trouvé qqchose d'utile :

    Echoing an XML File with the SAX Parser

    Et plus particulièremetn ce code non ? :

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
     
    /*
     * @(#)Echo03.java 1.5 99/02/09
     *
     * Copyright (c) 2002 Sun Microsystems, Inc.  All rights reserved.  U.S.
     *
     * Government Rights - Commercial software.  Government users are subject
     * to the Sun Microsystems, Inc. standard license agreement and
     * applicable provisions of the FAR and its supplements.  Use is subject
     * to license terms.
     *
     * This distribution may include materials developed by third parties.
     * Sun, Sun Microsystems, the Sun logo, Java and J2EE are trademarks
     * or registered trademarks of Sun Microsystems, Inc. in the U.S. and
     * other countries. 
     * 
     */
     
    import java.io.*;
     
    import org.xml.sax.*;
    import org.xml.sax.helpers.DefaultHandler;
     
    import javax.xml.parsers.SAXParserFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
     
    public class Echo03 extends DefaultHandler
    {
        StringBuffer textBuffer;
     
        public static void main(String argv[])
        {
            if (argv.length != 1) {
                System.err.println("Usage: cmd filename");
                System.exit(1);
            }
     
            // Use an instance of ourselves as the SAX event handler
            DefaultHandler handler = new Echo03();
     
            // Use the default (non-validating) parser
            SAXParserFactory factory = SAXParserFactory.newInstance();
            try {
                // Set up output stream
                out = new OutputStreamWriter(System.out, "UTF8");
     
                // Parse the input
                SAXParser saxParser = factory.newSAXParser();
                saxParser.parse( new File(argv[0]), handler);
     
            } catch (Throwable t) {
                t.printStackTrace();
            }
            System.exit(0);
        }
     
        static private Writer  out;
        private String indentString = "    "; // Amount to indent
        private int indentLevel = 0;
     
        //===========================================================
        // SAX DocumentHandler methods
        //===========================================================
     
        public void startDocument()
        throws SAXException
        {
            nl();
            nl();
            emit("START DOCUMENT");
            nl();
            emit("<?xml version='1.0' encoding='UTF-8'?>");
        }
     
        public void endDocument()
        throws SAXException
        {
            nl(); 
            emit("END DOCUMENT");
            try {
                nl();
                out.flush();
            } catch (IOException e) {
                throw new SAXException("I/O error", e);
            }
        }
     
        public void startElement(String namespaceURI,
                                 String sName, // simple name
                                 String qName, // qualified name
                                 Attributes attrs)
        throws SAXException
        {
            echoText();
            indentLevel++;
            nl(); 
            emit("ELEMENT: ");
            String eName = sName; // element name
            if ("".equals(eName)) eName = qName; // not namespaceAware
            emit("<"+eName);
            if (attrs != null) {
                for (int i = 0; i < attrs.getLength(); i++) {
                    String aName = attrs.getLocalName(i); // Attr name 
                    if ("".equals(aName)) aName = attrs.getQName(i);
                    nl();
                    emit("   ATTR: ");
                    emit(aName);
                    emit("\t\"");
                    emit(attrs.getValue(i));
                    emit("\"");
                }
            }
            if (attrs.getLength() > 0) nl();
            emit(">");
        }
     
        public void endElement(String namespaceURI,
                               String sName, // simple name
                               String qName  // qualified name
                              )
        throws SAXException
        {
            echoText();
            nl();
            emit("END_ELM: ");
            String eName = sName; // element name
            if ("".equals(eName)) eName = qName; // not namespaceAware
            emit("</"+eName+">");
            indentLevel--;
        }
     
        public void characters(char buf[], int offset, int len)
        throws SAXException
        {
            if (textBuffer != null) {
              echoText();
              textBuffer = null;
            }
            String s = new String(buf, offset, len);
            if (textBuffer == null) {
               textBuffer = new StringBuffer(s);
            } else {
               textBuffer.append(s);
            }
        }
     
        //===========================================================
        // Utility Methods ...
        //===========================================================
     
        // Display text accumulated in the character buffer
        private void echoText()
        throws SAXException
        {
            if (textBuffer == null) return;
            nl(); 
            emit("CHARS:   ");
            String s = ""+textBuffer;
            if (!s.trim().equals("")) emit(s);
            textBuffer = null;
        }
     
        // Wrap I/O exceptions in SAX exceptions, to
        // suit handler signature requirements
        private void emit(String s)
        throws SAXException
        {
            try {
                out.write(s);
                out.flush();
            } catch (IOException e) {
                throw new SAXException("I/O error", e);
            }
        }
     
        // Start a new line
        // and indent the next line appropriately
        private void nl()
        throws SAXException
        {
            String lineEnd =  System.getProperty("line.separator");
            try {
                out.write(lineEnd);
                for (int i=0; i < indentLevel; i++) out.write(indentString);
            } catch (IOException e) {
                throw new SAXException("I/O error", e);
            }
        }
    }
    Comme l'a indiqué Grégory Picavet, méfie toi de l'necoding !!! Dans l'exemple l'indentation est géré déjà

    Ca t'a aidé ?

    Haaz

  4. #4
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Merci beaucoup Messieurs Picavet et Haazheel,

    Le but du post était juste de savoir s'il existait une API specifique pour générer "à la volée" des fichiers XML : la réponse est donc non (si j'ai bien compris). Pour le problème de l'encodage, j'y avait pensé; comme je travaille en C++ il se pose même lorsque je passe par SAX ou DOM (je suis toujours obligé de jongler entre l'UTF16 (short*) et les char*), ce qui ne doit pas être le cas en java.

    L'exemple est moyennement utile puisque je n'ai pas comme point de depart un document que je peux parser via SAX. Enfin, merci quand même.

    Tschaw,

    PS : Tu as raison Gregory, l'indentation je m'en fiche (à la limite ça pourrait servir en debugging, mais certains editeurs (xmlspy) le font automatiquement).

    PPS : je vais essayé de mettre le TAG résolu sur mon post, mais je l'ai encore jamais fait, donc j'ai un peu peur de pas trouver la bonne option...

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 27
    Points : 21
    Points
    21
    Par défaut
    Rah zut ! je crois toujours que tout le monde est en java... dsl

    Effectivement du coup mon exemple il est tout pourri bon j'avias pas bien compris la question

    Et si en java l'encoding aussi m'a posé des soucis et m'en pose encore

    Bonne continuation

    Haaz

  6. #6
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Excuse-moi Haazheel, juste une petite question (pour ma culture générale (et pour pouvoir briller en société)), en Java les chaines ne sont pas codées en UTF-16 de façon native ?

    Pourquoi alors y aurait-il des problèmes d'encodage ?

    A+

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 27
    Points : 21
    Points
    21
    Par défaut
    Nan enfin j'ai eu des problèmes en générant du XML afin d'obtenir un PDF...

    Tout plantait... et sur mon poste en local tout marchait... frustrant... ben en local ca utilisait du je sais plus quoi et sur le serveur de l'UTF 8... du coup obligation de modifier le reader pour lui dire gentimment... C'EST PAS DE l'UTF 8 GROS C... !!!

    Voila voila

    Haaz

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

Discussions similaires

  1. [DOM] parser une String pour en faire un document XML
    Par Fladnag dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 29/03/2004, 11h04
  2. recherche dans un document xml via DOM
    Par ndoye_zaff dans le forum APIs
    Réponses: 5
    Dernier message: 11/06/2003, 14h44
  3. Réponses: 3
    Dernier message: 03/06/2003, 13h16
  4. Stocker du texte mis en forme dans un document XML
    Par ovh dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 13/02/2003, 10h23
  5. pb formatage document XML généré par un dom tree
    Par lionel69 dans le forum APIs
    Réponses: 11
    Dernier message: 17/10/2002, 09h53

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