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 :

[Flux][Xalan] ResultSet vers stdout en passant par un XSLT


Sujet :

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

  1. #1
    B&B
    B&B est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 14
    Points
    14
    Par défaut [Flux][Xalan] ResultSet vers stdout en passant par un XSLT
    Bonjour,

    Avant tout, je suis en JDK 1.1.8, et je ne peux pas la mettre à jour.
    Je pourrais peut-etre passer aux maximum en 1.2.2,
    mais ce n'est pas sur du tout.

    En entree :
    J'ai un ResulSet qui contient un document XML pouvant aller jusqu'a 2Mo dans certains cas.
    (Pour avoir une idee plus claire, lorsque je finis de lire mon ResultSet
    et que je l'affiche à l'ecran, j'ai le contenu d'un fichier XML avec
    les balises et les données...)

    En sortie : je dois avoir l'XML transformé en HTML grace a XSLT

    -------------------------------------------------------------------------------

    Ca marche, mais c'est long....et je ne sais pas ce qui prend le plus de temps. (Mon prog est une Servlet)
    Le 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
    PrintWriter out = res.getWriter();
           .....
           ResultSetMetaData rsmd = rsCli.getMetaData();
           int numCols = rsmd.getColumnCount();
           String xml= "";
           while ( rsCli.next()) 
            {
                for(int i = 1; i <= numCols; i++)
                {
                 xml +=rsCli.getString(i);
                }
            }
           ByteArrayInputStream reader = new ByteArrayInputStream(xml.getBytes());     
           XSLTProcessor processor2 = XSLTProcessorFactory.getProcessor();
           processor2.process(new XSLTInputSource(reader),
                            new XSLTInputSource("testxsl1.xsl"),
                            new XSLTResultTarget(out));
    Lors de la lecture du resulset (je recupere du String ),je concatene les champs dans un String.
    A la fin,j'ai un String qui contient le fichier XML.

    Afin de transformer le XML en HTML, j'utilise la classe XSLTProcessor, de l'api Xalan...version....1.0 ! ! ! Et oui ça date.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    XSLTProcessor prc = XSLTProcessorFactory.getProcessor();
           prc.process(new XSLTInputSource(reader),
                            new XSLTInputSource("urldeXLST"),
                            new XSLTResultTarget(out));
    XSLTInputSource peut recevoir en entrée soit le chemin du fichier XML,
    soit un Reader, soit un InputSream.
    http://e-docs.bea.com/wls/docs61/Xal...putSource.html


    Donc j'ai converti le String XML en ByteArrayInputStream ,
    et je l'ai passe en argument à XSLTInputSource.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ByteArrayInputStream reader = new ByteArrayInputStream(xml.getBytes());


    Tout en gardant le meme deroulement assez barbare,
    quel est le moyen le plus rapide pour passer le ResultSet
    en argument du constructeur XSLTInputSource ?

    Y-a t'il une solution pour transformer directement
    le ResultSet en Reader ou InputStream ?

    Merci, ++

  2. #2
    Membre confirmé Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Points : 570
    Points
    570
    Par défaut
    Salut, désolé je vais pas t'aider plus que ça parce que je n'ai pas cherché sur ton problème, mais je te donne juste un conseil quand tu dois stocker la lecture d'un fichier dans une String utilise une StringBuffer (avec append) qui évite de recrée a chaque fois une string

    c'est vrai que le += est pratique mais si ton fichier fait 2mo a chaque fois il récrée une string et c'est un gasillaqge énorme

    voilà c'était juste un conseil

  3. #3
    Membre confirmé Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Points : 570
    Points
    570
    Par défaut
    En jettant un ptit coup d'oeil sur l'api j'ai trouvé ceci getCharacterStream qui te retourne un java.io.Reader donc à voir si ca peut t'interesser mais bon ca n'existe que depuis la 1.2 et puis cette methode te retourne la valeur (enfin le reader) d'une colonne de la ligne courante donc il faudra l'utiliser autant de fois que tu as de colonne et boucle sur les lignes.

    Peux tu nous dire pourquoi tu as cette impératif d'avoir des versiond de Java aussi anciennes ?

  4. #4
    B&B
    B&B est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Je suis stagiaire dans une entreprise qui travaille sur l'AS400 d'IBM, et cela fait un bon moment qu'ils n'ont pas mis a jour leur systeme, et ca risque encore de durer un bon bout de temps.

    Donc je suis bloqué avec une JDK 1.1.8.La 1.2.2 est installé, mais pour le moment, je ne sais pas si je pourrai l'utiliser.

    En attendant, je vais essayer les StringBuffer, merci =).

  5. #5
    B&B
    B&B est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    wow, avec le StringBuffer, j'ai pratiquement perdu la moitié du temps d'affichage (de 11.5 sec, je suis passe a 5/5.5 sec ),jte remercie Scorpyosis.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
           StringBuffer xml=new StringBuffer();
          while ( rsCli.next()) 
            {
                for(int i = 1; i <= numCols; i++)
                {
                 xml.append(rsCli.getString(i));
                }
            }
     
           ByteArrayInputStream reader = new ByteArrayInputStream(xml.toString().getBytes());

    D'autres suggestions ?
    Ou du moins pour la transformation String->Reader ou InputStream.

  6. #6
    B&B
    B&B est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    J'ai essayé la transformation en Reader,BufferedReader,StringReader : le temps d'affichage augmente d'1 seconde a peu pres.

    Je vais donc rester sur le ByteArrayInputStream je pense.
    J'ai aussi essaye la classe StringBufferInputStream , mais elle est depréciée =/, quoique pour ma version de JDK, peu importe

    ++, mais je suis tjs preneur d'autres methodes

  7. #7
    Membre confirmé Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Points : 570
    Points
    570
    Par défaut
    Non malheuresement je n'ai pas d'autre méthode miracle comme celle là
    le seul conseil que je peux te donner c'est regarde dans ton tout code les boucles si tu peux pas les optimiser par exemple si tu fais un while et un if juste derriere c'est pas optimisé. Ne pas oublier que certains objets comme les String sont des objets uniques et non modifiable, a chaque fois qu'on rajoute/enlève/modifie une String on en recée une autre. Et le dernier point qui fait perdre du temps est les accés disque pour la lecture d'un fichier donc il faut toujours essayer de s'arranger pour ne le faire qu'une seule fois.

    Sinon pour ton passage String-> Reader ou InputStream je ne l'ai jamais fait ni réfléchis dessus donc malheuresemnt je en peux as t'etre d'une grande aide....

Discussions similaires

  1. Passage d'une activuté vers une autre en passant par la ListView
    Par karilux dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 03/07/2014, 11h53
  2. [AC-2007] exporter un état vers excell en passant par le ruban
    Par mbo2 dans le forum IHM
    Réponses: 1
    Dernier message: 27/04/2013, 15h01
  3. Réponses: 1
    Dernier message: 02/01/2007, 19h55
  4. [math] equ sinusoide passant par deux points
    Par ddams dans le forum Mathématiques
    Réponses: 11
    Dernier message: 24/05/2003, 14h12
  5. Affichage en passant par un buffer...
    Par Sirotilc dans le forum MFC
    Réponses: 5
    Dernier message: 27/05/2002, 21h00

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