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 :

Transformer un très gros fichier XML avec XSL


Sujet :

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

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Transformer un très gros fichier XML avec XSL
    Bonjour,

    Je débute dans l'utilisation d'XML avec Java et je suis confronté à un petit problème.

    J'ai lu sur Internet que SAX était évènementiel et consommait peu de mémoire ce qui était particulièrement intéressant pour la manipulation de gros fichiers XML.

    Dans le code que j'écris ci-dessous, j'utilise SAX (ou en tout cas je crois que je l'utilise) pour transformer mon document XML avec une feuille XSL. Le problème est que cette transformation prend quelques 450Mo en mémoire pour transformer le flux initial XML de 40Mo.

    Les fichiers de production pourront atteindre quelques 200Mo et je cherche donc à trouver une solution peu consommatrice de mémoire et pouvant traiter des très gros fichiers XML.


    Le code écrit ci-dessous est-il correct ? Pourquoi ai-je tant de consommation mémoire si j'utilise SAX ?


    Merci par avance pour toute l'aide que vous pourrez m'apporter.



    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
     
    package xml;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
     
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Result;
    import javax.xml.transform.Templates;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.sax.SAXSource;
    import javax.xml.transform.stream.StreamResult;
     
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.XMLReaderFactory;
     
     
     
    public class XSLTransformer3 {
      public static void main(String[] args) {
        try {
     
     
          System.setProperty("org.xml.sax.driver", "org.apache.xerces.parsers.SAXParser");
     
          XMLReader analyseurSax = XMLReaderFactory.createXMLReader();
     
          InputSource sourceEntreeXSL = new InputSource(new FileInputStream("feuille.xsl"));
          SAXSource sourceXSL = new SAXSource(analyseurSax, sourceEntreeXSL);
     
          InputSource sourceEntreeXML = new InputSource(new FileInputStream("grosFichier.xml")); // > à 200Mo
          SAXSource sourceXML = new SAXSource(analyseurSax, sourceEntreeXML);
     
          TransformerFactory fabrique = TransformerFactory.newInstance();
     
          Templates modeles = fabrique.newTemplates(sourceXSL);
          Transformer transformateur = modeles.newTransformer();
     
          transformateur.setOutputProperty(OutputKeys.METHOD, "xml");
          transformateur.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
          transformateur.setOutputProperty(OutputKeys.INDENT, "no");
     
          File oFic = new File("resultat.xml"); // fichier obtenu après transformation
          FileOutputStream fos = new FileOutputStream(oFic);
     
          if (fos != null) {
            Result sortie = new StreamResult(fos);
            transformateur.transform(sourceXML, sortie);
          }
          fos.flush();
          fos.close();
     
        }
        catch (TransformerConfigurationException e) {
          e.printStackTrace();
        }
        catch (SAXException e) {
          e.printStackTrace();
        }
        catch (FileNotFoundException e) {
          e.printStackTrace();
        }
        catch (TransformerException e) {
          e.printStackTrace();
        }
        catch (IOException e) {
          e.printStackTrace();
        }
      }
    }

  2. #2
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Complément d'infos
    Mon programme java ne semble pas en cause, puisque l'exécution en ligne de commande de la transformation de mon GROS fichier XML par une feuille XSL ne fonctionne pas non plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.exe -cp saxon8.jar net.sf.saxon.Transform -o output.xml input.xml transform.xsl

    Comment traiter la transformation par XSL de gros fichier alors ?

  3. #3
    Membre habitué Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Points : 156
    Points
    156
    Par défaut
    Bonjour,

    Voici un lien qui devrait t'intéresser :
    http://joost.sourceforge.net/
    C'est une implémentation de STX (Streaming Transformations for XML).

    Sinon en utilisant XSLT tu peux essayer :
    - d'allouer plus de mémoire à ta JVM (voir FAQ pour les options de lancement).
    - d'utiliser un produit commercial (par exemple : http://www.infonyte.com/en/prod_pxslt.html)

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Merci
    Merci Xavinou pour ces pistes intéressantes. Je vais regarder ça.

Discussions similaires

  1. extraire un noeud d'un fichier XML avec XSL
    Par piapia1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 25/01/2010, 14h39
  2. [CSV] Traitement d'un très gros fichier XML ou CSV
    Par Paulux1 dans le forum Langage
    Réponses: 3
    Dernier message: 25/03/2008, 16h05
  3. [SimpleXML] Analyser un très gros fichier XML
    Par Paulux1 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 20/02/2008, 02h53
  4. Ouvrir un très gros fichier XML
    Par strat0 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 02/11/2007, 13h29
  5. extraire un fichier d'un fichier XML avec XSL ?
    Par pirbd dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 14/09/2005, 10h31

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