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 :

parser un stream et revenir un jour [SAX]


Sujet :

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

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Par défaut parser un stream et revenir un jour
    Bonjour à tous,

    J'aimerais parser un message XML que je reçois sur une socket et quand le message est fini, le parser devrais rendre la main. Seulement, non, il ne rend pas la main car il lit un flux, or le flux n'a pas de fin. Je comprends que ce comportement soit une fonctionnalité et pas un bug mais comment faire dans mon cas ? Pour l'instant mon code ressemble à ceci (je mets tout à la suite) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    InputStream iStream;
    //sock = new socket(); ...
    iStream = sock.getInputStream();
    XMLReader saxReader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
    saxReader.setContentHandler(new XmlReaderServerConnection(this));
    BufferedReader receiving = new BufferedReader( new inputStreamReader(iStream));
    saxReader.parse(new InputSource(receiving));  
    /*et là, je souhaiterai pouvoir exécuter ceci sans avoir à détruire ou fermer le flux*/
    merci beaucoup.

  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
    Ça c'est chiant. En principe, dans ce cas-là le document XML est encadré dans un protocole de plus haut niveau.
    Le protocole dit en gros "et maintenant j'envoie un texte qui fait 435 octets" et de l'autre côté, celui qui lit la Socket fait une sorte d'InputStream qui lit la Socket mais qui se termine après 435 octets, même si la Socket, elle, ne se termine pas.

    Autre possibilité plus simple : lire tous les octets du XML, les mettre dans un gros byte[], puis transformer ça en ByteArrayInputStream et passer ça au parseur XML.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Par défaut
    Pfiou, et ben merci pour cette réponse éclaire, je m'y met de ce pas, et je vous tiens au courant.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Par défaut
    Alors je l'ai fait avec une chaine de caractère (ce qui rejoint les bytes[]) et je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String message="";
    receiving = new BufferedReader( new InputStreamReader(iStream));
    while(receiving.ready())
    {
       s += receiving.readLine();
    }
    saxReader.parse(new InputSource(new StringReader(message)));
    Et ca marche !
    Le seul problème c'est que cela ne semble pas bloquant si iStream est vide. Je devrais faire un "read" sur iStream pour bloquer tant qu'il est vide et ensuite rajouter ce caractère au début de message ou il y a quelque chose de plus élégant ?
    merci encore

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Par défaut
    Alors voilà un travail bien sale mais qui marche. J'ai fait une classe qui fait tout le travail pour transformer un InputStream en InputSource, attention ça pique les yeux :
    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
     
    public class StreamToInput {
     
        public InputSource transform(InputStream stream){
            String s=""; //the string that will be sent
            char c = '<'; //the first character
            try {
                c = (char)stream.read();//used to block until the stream is not empty
            } catch (IOException ex) {
                Logger.getLogger(StreamToInput.class.getName()).log(Level.SEVERE, null, ex);
            }
            s +=c;//put back the first character
            BufferedReader receiving = new BufferedReader( new InputStreamReader(stream));
            try {
                while(receiving.ready())
                {
                    String line = receiving.readLine();//get a line
                    if(line == null)//the stream has been closed
                    {
                        return null;
                    }
                    s += line;//fill the string with all data
                    //System.out.println("read line : " + line);
                }
                //System.out.println("receving : "+s);
            } catch (IOException ex) {
                Logger.getLogger(StreamToInput.class.getName()).log(Level.SEVERE, null, ex);
            }
            return new InputSource(new StringReader(s));//and return it
        }
    }
    Encore merci et n'hésitez pas si vous avez d'autres idées plus élégantes (ou que vous voulez rétablir les bonnes pratiques).
    Je mets le sujet en résolu mais la discussion n'est peut-être pas finie.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/09/2013, 08h51
  2. Réponses: 16
    Dernier message: 03/05/2012, 14h22
  3. Parser une date sans depasser jours et mois
    Par zarohn dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 19/11/2010, 21h37
  4. [DOM] Parser un fichier xml avec mise à jour variable
    Par toussef dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 20/01/2010, 11h48
  5. [stax]parser un stream xml avec stax
    Par noOneIsInnocent dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 19/03/2007, 12h39

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