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 InputStream


Sujet :

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

  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Par défaut Parser un InputStream
    Voilà mon problème. J'envoie une requête HTTP à un serveur et celui-ci me retourne un flux XML que je récupère en InputStream. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    InputStream response = socket.getInputStream();
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(response);
    socket.close();
    Voici ce qu'il y a dans mon InputStream :

    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
    HTTP/1.1 200 OK
    Content-Type: text/plain
    Transfer-Encoding: chunked
    Date: Thu, 11 Aug 2005 09:34:12 GMT
    Server: Apache Coyote/1.0
     
    fc
    <?xml version="1.0" encoding="ISO8859_1"?>
    <ARCXML version="1.1">
    <RESPONSE>
    <ERROR machine="mdp-preprod.capgemini.fr" processid="1478" threadid="3076">
    AXLParser: Document cannot be parsed correctly. Check encoding.
    </ERROR>
    </RESPONSE>
    </ARCXML>0
    Mon problème est que la méthode parse retourne une exception me disant que l'élément racine est manquant. J'imagine que c'est la partie avant <?xml version...> qui pose problème. Alors comment faire pour ne pas prendre en compte cette partie ?

  2. #2
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Simple, passe l'URL directement au parser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Document document = builder.parse("http://.../fichier.xml");

  3. #3
    Membre éprouvé Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Par défaut
    Citation Envoyé par Gfx
    Simple, passe l'URL directement au parser :
    Cela fonctionne si le fichier que tu passes dans l'URL existe. Dans le cas de alexixlebaulois, le flux semble généré par le serveur. Si c'est ca, la méthode de l'URL ne fonctionnera pas.

    Donc, alexixlebaulois, si tu peux nous donner un peu plus de précisions sur comment est généré ce flux XML ...

    Nin2 (du Pouliguen !)

  4. #4
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Mais heu tu passes une URL or une URL ne correspond pas forcément à un fichier physique. Tu t'en fous du moment que le serveur renvoie une réponse HTTP contenant un document XML. Donc ça marche.

  5. #5
    Membre éprouvé Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Par défaut
    Ouais, d'accord pour l'histoire de l'URL. Mais de cette manière il récupérera la même entrée qu'avec son InputStream. Donc ca risque de faire la même erreur que précédemment, non ?
    Le truc, c'est qu'il faudrait dégager l'entête qu'il récupère dans le flux issu du serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    HTTP/1.1 200 OK
    Content-Type: text/plain
    Transfer-Encoding: chunked
    Date: Thu, 11 Aug 2005 09:34:12 GMT
    Server: Apache Coyote/1.0
     
    fc

  6. #6
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Mais non car tu passes l'URL au parseur qui lui va se charger de virer l'en-tête pour toi. Sinon c'est très simple de lire l'input stream jusqu'à ce que l'en-tête soit finit, il suffit de chercher la suite \r\n\r\n.

  7. #7
    Membre éprouvé Avatar de nin2
    Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Par défaut
    tu passes l'URL au parseur qui lui va se charger de virer l'en-tête pour toi.
    Ah ok, je ne savais pas. A vrai dire j'utilise toujours les parseurs XML sur des fichiers locaux donc je ne savais pas qu'ils étaient capables de gérer ces histoires d'entête de flux.

    Donc dans ce cas, c'est nickel.

    Sinon c'est sur que virer l'entête dans le InputStream, c'est pas trop compliqué ...

  8. #8
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Par défaut
    salut à tous. Je vois que mon histoire est sujète à discussion. Alors je vais apporter quelques précisions. Voilà comment tout fonctionne :
    -je crée une requête XML contenant des instructions pour demander quelque chose à une appli sur un serveur.
    -j'envoie cette requête à mon serveur.
    -l'appli traite ma requête et me renvoie un flux (InputStream) XML contenant la réponse à ma requête (il ne me renvoie pas l'URL d'un fichier XML, il m'envoie son contenu).
    -je dois ensuite parser ce flux pour récupérer mes infos.

    Du coup le truc de passer au parser une URL ne peut pas fonctionner.

    PS : salut à mes amis du Pouliguen à qui je donne RDV au petit verre ce week-end

  9. #9
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Par défaut
    salut à tous. Je vois que mon histoire est sujète à discussion. Alors je vais apporter quelques précisions. Voilà comment tout fonctionne :
    -je crée une requête XML contenant des instructions pour demander quelque chose à une appli sur un serveur.
    -j'envoie cette requête à mon serveur.
    -l'appli traite ma requête et me renvoie un flux (InputStream) XML contenant la réponse à ma requête (il ne me renvoie pas l'URL d'un fichier XML, il m'envoie son contenu).
    -je dois ensuite parser ce flux pour récupérer mes infos.

    Du coup le truc de passer au parser une URL ne peut pas fonctionner.

    PS : salut à mes amis du Pouliguen à qui je donne RDV au petit verre ce week-end

  10. #10
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Et pourquoi, ça ne devrait pas fonctionner?

    Si tu envoies une requête à un serveur HTTP, il te retourne toujours une réponse.

    Dans ton cas, il suffit d'effectuer une requête (la fameuse URL). Le serveur traitera ta demande et te renverra une réponse (ton flux xml).

    En plus, tu peux passer des paramètres avec ta URL.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://example.com/example/processor?param1=x&param2=y

  11. #11
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Par défaut
    Le problème c'est que voilà ma méthode qui envoie la requête :

    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
    public Document send(String request) throws Exception{
    		Socket socket = new Socket(_host, _port);
    		PrintStream printstream = new PrintStream(socket.getOutputStream());
    		printstream.print("POST /servlet/com.esri.esrimap.Esrimap?ServiceName=" + _service +
    		"&Form=True&Encode=True HTTP/1.1\r\n");
    		printstream.print("Host: " + _host + "\r\n");
    		printstream.print("Content-type: text/plain\r\nContent-length: " + request.length() + "\r\n\r\n");
    		printstream.print(request);
    		printstream.flush();
    		InputStream response = socket.getInputStream();
     
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		factory.setExpandEntityReferences(true);
    	    DocumentBuilder builder = factory.newDocumentBuilder();
    	    Document document = builder.parse(response);
    		socket.close();
    		return document;
    	}
    Comme tu vois je crée une socket et j'envoies le tout en POST donc je peux pas balancer ma requête http au parser

  12. #12
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Par défaut

  13. #13
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Oui en effet cela ne fonctionnera pas (fallait préciser :p). Donc tu n'as qu'à lire l'inputstream jusqu'au \r\n\r\n qui marque la fin de l'en-tête et passer ensuite le flux au DocumentBuilder.

    Note que dans ton cas le Transfert-Encoding vaut "chunked", la taille de la réponse se trouve donc sur la première ligne après l'en-tête. Tu devras donc aussi éliminer cette ligne quand le Transfert-Encoding vaut chunked. Cela demandera un peu plus de travail lors de la lecture de l'en-tête mais avec un StringTokenizer, ou des regex, ça ne devrait pas être trop dur.

Discussions similaires

  1. [JAXP] com.sun.xml.parser.ValidatingParser
    Par yolepro dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 05/11/2008, 15h36
  2. parser xml
    Par billout dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/11/2003, 11h08
  3. [Servlet] parser la requete
    Par jaimepasteevy dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 15/10/2003, 16h43
  4. Parser XML
    Par miloux32 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 03h17
  5. [langage] Continuer a parser une ligne
    Par D[r]eadLock dans le forum Langage
    Réponses: 5
    Dernier message: 30/09/2002, 18h49

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