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

Web & réseau Delphi Discussion :

Get, Flux XML analyse et affichage en live


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Par défaut Get, Flux XML analyse et affichage en live
    Bonjour

    J'ai un programme à réaliser qui consiste à récupérer un flux (j'utilise THttpCli de ICS) avec un GET, sur un serveur (Logiciel embarquant un serveur web). Le serveur me réponds avec un keep-alive pour maintenir la connexion, car ce dernier m'envoie des informations d'état régulièrement en XML. Je souhaite analyser en temps réel ce flux XML.

    Je fais donc le GET dans un thread (je me suis servi des démo de ICS) et j'ai un problème avec l'analyse du XML. En effet, je ne crois pas pouvoir accéder au HttpCli.rcvdstream en même temps en écriture (par le get dans mon thread) et en lecture (par l'affectation à un objet TMemoryStream dans la procédure initiale). Je pensais peut-être me servir d'un fichier temporaire ou d'une pile, mais j'aimerais des conseils avisés avant de me jeter !

    Le but de tout cela est de pouvoir sélectionner les événement contenus dans les messages XML qui m'intéressent.

    Je ne sais pas vraiment comment faire, je (re)débute en programmation et en Delphi en particulier. Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Mobybic Voir le message
    Bonjour

    J'ai un programme à réaliser qui consiste à récupérer un flux (j'utilise THttpCli de ICS) avec un GET, sur un serveur (Logiciel embarquant un serveur web). Le serveur me réponds avec un keep-alive pour maintenir la connexion, car ce dernier m'envoie des informations d'état régulièrement en XML. Je souhaite analyser en temps réel ce flux XML.

    Je fais donc le GET dans un thread (je me suis servi des démo de ICS) et j'ai un problème avec l'analyse du XML. En effet, je ne crois pas pouvoir accéder au HttpCli.rcvdstream en même temps en écriture (par le get dans mon thread) et en lecture (par l'affectation à un objet TMemoryStream dans la procédure initiale). Je pensais peut-être me servir d'un fichier temporaire ou d'une pile, mais j'aimerais des conseils avisés avant de me jeter !

    Le but de tout cela est de pouvoir sélectionner les événement contenus dans les messages XML qui m'intéressent.

    Je ne sais pas vraiment comment faire, je (re)débute en programmation et en Delphi en particulier. Merci pour votre aide
    Si je ne m'abuse ICS fonctionne par événements et non par Thread, tu dois donc avoir un événement qui se déclenche à la réception d'une réponse XML et tu peux alors la traiter non ?

    Ceci dit, quand tu parles de recevoir régulièrement des informations...Keepalive ne sert pas à ça, à moins que tu n'ais fait un raccourci dans ta question.

    KeepAlive permet de garder le socket ouvert pour enchaîner des requêtes sur la même connexion, ce qui impose que la réponse possède dans son entête HTTP un Content-Length qui permet au client de savoir que la réponse est complète et qu'il peut passer à la requête suivante (sinon il attend la fermeture de la connexion).

    En tout état de cause, pour un GET tu n'as qu'une seule réponse quelque soit le mode de connexion !

    Mais il est tout à fait possible d'avoir une réponse "longue" constituée de plusieurs fichiers XML mis bout à bout, le XML lui-même délimitant les différentes parties. Et rien ne t'empêche de traiter la réponse au fur et à mesure de la lecture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    GET / HTTP/1.0
     
    200 OK
    Content-type: text/xml
     
    <!-- premier fichier -->
    <?xml>
    <...>
    </xml>
    <!-- deuximème fichier -->
    <?xml>
    <...>
    </xml>
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Par défaut
    Bonjour et merci pour ta réponse très rapide.

    Tu as globalement bien compris ma demande malgré mon explication floue :d

    Alors en effet, il y a un événement à chaque réception d'un message complet, la démo de ICS me le fait constater en affichant un message (Sur evt DocBegin, DocEnd)

    Pour le keep-alive, j'ai effectivement fait un raccourci je crois. Je voulais signifier que faisant un get et ne fermant pas la connexion, la requête est bloquante (Donc je la met dans un thread supplémentaire pour effectuer d'autres actions). En gérant correctement les événements DocBegin et Doc End, j'aurais certainement pu me passer d'un thread supplémentaire?

    Voilà ce que j'ai en réponse XML enregistré dans un fichier (Exactement ce que tu as marqué dans ton message ):

    ***********************
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:26
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:26
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:31
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:31
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:36
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:36

    ********************************

    Et en conclusion, ma question est dans ta dernière phrase :

    Comment traiter ce flux à la volée, au fur et à mesure qu'il arrive?

    Faut-il que sur un événement DocData je lance le parser (Qui soit dit en passant attend un paramètre Pchar alors que j'ai un flux Tmemorystream...)? Et ce dans l'unité du thread et pas dans l'unité principale?

    Merci beaucoup pour le soutien

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Mobybic Voir le message
    Bonjour et merci pour ta réponse très rapide.

    Tu as globalement bien compris ma demande malgré mon explication floue :d

    Alors en effet, il y a un événement à chaque réception d'un message complet, la démo de ICS me le fait constater en affichant un message (Sur evt DocBegin, DocEnd)

    Pour le keep-alive, j'ai effectivement fait un raccourci je crois. Je voulais signifier que faisant un get et ne fermant pas la connexion, la requête est bloquante (Donc je la met dans un thread supplémentaire pour effectuer d'autres actions). En gérant correctement les événements DocBegin et Doc End, j'aurais certainement pu me passer d'un thread supplémentaire?

    Voilà ce que j'ai en réponse XML enregistré dans un fichier (Exactement ce que tu as marqué dans ton message ):

    ***********************
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:26
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:26
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:31
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:31
    --DigifortBoundary
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 203

    RESPONSE_CODE=0
    RESPONSE_MESSAGE=OK
    OBJECTDATA_NAME=
    OBJECTDATA_TYPE=
    EVENTDATA_NAME=
    EVENTDATA_TYPE=KEEP_ALIVE
    EVENTDATA_TIMESTAMP=2011-02-18 22:27:36
    EVENTDATA_UTCTIMESTAMP=2011-02-18 21:27:36

    ********************************

    Et en conclusion, ma question est dans ta dernière phrase :

    Comment traiter ce flux à la volée, au fur et à mesure qu'il arrive?

    Faut-il que sur un événement DocData je lance le parser (Qui soit dit en passant attend un paramètre Pchar alors que j'ai un flux Tmemorystream...)? Et ce dans l'unité du thread et pas dans l'unité principale?

    Merci beaucoup pour le soutien
    je ne comprend pas bien à quoi correspond tes données ci-dessus qui ne sont en tout cas pas de l'XML

    tout va dépendre de ton parser, est-il lui capable de traiter les données à la volée ? c'est à dire de traiter un début de fichier, te rendre la main car il n'a plus de données puis reprendre quand tu lui fournis la suite du fichier ?

    sinon c'est pas très compliqué de copier le Stream d'ICS dans un STRING que tu envoie comme PChar à ton Parser une fois que le flux contient un fichier complet (DocEnd ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      SetLength(str, Stream.size);
      stream.position := 0;
      stream.read(str[1], length(str));
      Parser.Process(PChar(str)); 
     
    //--- ou éventuellement si c'est un MemoryStream
      z := 0;
      stream.write(z, 1); // ajout d'un #0
      Parser.Process(PChar(stream.Memory));
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Par défaut
    Bonjour

    Merci beaucoup Paul

    J'ai collé la version Texte des messages, pas la version XML (J'ai la possibilité de recevoir en réponse au get le texte ou le xml)

    Je vais regarder tout ça ce soir et demain soir, et revenir donner mon résultat. Je dois analyser les EVENT_DATA_TYPE de chaque message XML (Message qui est compris entre les commentaires "--DigifortBoundary".

    Pour ce qui est du parser, je vais regarder ses capacités.(XML Parser de Stefan Heymann's)

    Pour ce qui est de la copie du string, est-ce que DocEnd donne la fin d'un message ou la fin du fichier complet (Get terminé)? si j'attend la fin de fichier, je risque d'attendre éternellement car c'est justement un monitoring et le flux issu du Get n'est jamais censé s'arrêter.

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Mobybic Voir le message
    Bonjour

    Merci beaucoup Paul

    J'ai collé la version Texte des messages, pas la version XML (J'ai la possibilité de recevoir en réponse au get le texte ou le xml)

    Je vais regarder tout ça ce soir et demain soir, et revenir donner mon résultat. Je dois analyser les EVENT_DATA_TYPE de chaque message XML (Message qui est compris entre les commentaires "--DigifortBoundary".

    Pour ce qui est du parser, je vais regarder ses capacités.(XML Parser de Stefan Heymann's)

    Pour ce qui est de la copie du string, est-ce que DocEnd donne la fin d'un message ou la fin du fichier complet (Get terminé)? si j'attend la fin de fichier, je risque d'attendre éternellement car c'est justement un monitoring et le flux issu du Get n'est jamais censé s'arrêter.
    ok c'est donc bien un seul GET et une longue réponse...dans ce cas il faudrait passer par OnData en stockant les données dans un buffer tant que le boundary n'est pas atteind.

    mais pourquoi s'embêter avec XML ? le format texte à l'air très bien et très simple
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Flux XML et affichage via XSL sans extension XSL ?
    Par manuef515 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 04/12/2008, 23h28
  2. Réponses: 3
    Dernier message: 10/04/2007, 19h57
  3. Comment indenter un flux XML avant affichage ?
    Par danyboy85 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 05/12/2006, 11h30
  4. probleme lors de l'analyse d'un flux xml sous asp
    Par jlassira dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/07/2005, 14h01

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