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

XML Discussion :

extraires données xml d'un char*


Sujet :

XML

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 44
    Points : 13
    Points
    13
    Par défaut extraires données xml d'un char*
    Salut à tous,

    j'ai un petit problème de code, vu que je suis en train de découvrir le c++.
    je récupère des données xml dans un char* (par l'intermédiaire d'un socket)
    et je voudrais extraires certaines informations de ce char* pour les mettre dans des strings. Mais je ne vois pas comment m'y prendre. On m'a parlé de libxml et de tinyxml, mais je dois avoué que je suis pas doué je n'arrive pas à les installer et à les intégrer dans mon programme. De plus il me semble que tinyxml fonctionne avec des fichier xml, ce qui n'est pas mon cas ici puisque j'ai une variable char*.
    quelqu'un pourrait-il m'aider à faire ce que je veux ?



    je précise que je tourne sous code::block sous windows et que mon programme doit être compilable sous win et sous linux.


    les données que je reçois sont de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE Alien-RFID-Tag_List [
    <!ELEMENT Alien-RFID-Tag_List (Alien-RFID-Tag*)>
    <!ELEMENT Alien-RFID-Tag (TagID, DiscoveryTime, LastSeenTime,
    Antenna, ReadCount, Protocol?)>
    <!ELEMENT TagID (#PCDATA)>
    <!ELEMENT DiscoveryTime (#PCDATA)>
    <!ELEMENT LastSeenTime (#PCDATA)>
    <!ELEMENT Antenna (#PCDATA)>
    <!ELEMENT ReadCount (#PCDATA)>
    <!ELEMENT Protocol (#PCDATA)>
    ]>
    je cherche principalement a extraires les valeurs "TagID", "LastSeen Time" et "Antenna".

    merci de votre aide !

    PS : oui comme vous l'aurez sans doute deviner mon programme est une petite interface pour un lecteur RFID chargée de faire de la détection de présence D

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    TinyXML est on ne peut plus simple à utiliser : si tu ne veux pas l'utiliser en tant que bibliothèque tu peux intégrer ses quelques fichiers directement à ton projet.

    Ensuite TinyXML permet bien entendu de parser un texte au format XML déjà en mémoire. Et même s'il ne faisait pas il serait facile de placer ton texte dans un fichier pour le lire.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 44
    Points : 13
    Points
    13
    Par défaut
    oui il serait facile de passer par un fichier, mais je ne peux pas pour une question de vitesse de traitement.

    ensuite pour ce qui est d'intégrer les fichiers de tiny directement dans mon programme et de l'utiliser directement avec un text en mémoire, comme je l'ai dit, je débute un peu, donc si tu as un tuto sous la main, je suis preneur, parce que j'ai pas réussi pour le moment !

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour l'intégration des fichiers... ben fais simplement comme si c'était toi qui les avait écrit, et traite les comme les autres fichiers sources de ton projet (je ne sais pas quel IDE tu utilises).

    Pour le chargement de données à partir d'un char*, faut voir la doc, je crois qu'il faut utiliser TiXmlDocument::Parse.

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 44
    Points : 13
    Points
    13
    Par défaut
    ok, merci

    je suis avec code::blocks comme IDE !

    j'ai trouvé une doc qui a l'air sympa http://khayyam.developpez.com/articles/cpp/tinyxml/

    mais il parle d'un truc que je comprends pas, et j'ai pas compris non plus sur la doc de tiny, tu peux peut etre m'éclairer :

    il parle de version STL et non STL, késako ?

    merci encore !

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    il parle de version STL et non STL, késako ?
    La version STL acceptera les chaînes sous forme de std::string, la version non-STL n'acceptera que des const char*.

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 44
    Points : 13
    Points
    13
    Par défaut
    ok, donc dans le doute, mieux vaut plus que pas assez
    sachant que c'est vite fait de passer de l'un à l'autre

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Dans le doute, mieux vaux utiliser la version qui permet d'utiliser les std::string...

    Ne serait ce que parce que tu auras beaucoup plus facile à gérer les std::string au sein de ton projet que de commencer avec des chaines de caractères C style, et que la convertion de std::string vers chaines C style est tres facile

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Pour le chargement de données à partir d'un char*, faut voir la doc, je crois qu'il faut utiliser TiXmlDocument:: Parse.
    Je confirme Laurent , c'est ce que j'utilise, et cela fonctionne bien.

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 44
    Points : 13
    Points
    13
    Par défaut
    je suis un peu polio
    j'arrive pas à l'utiliser

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    j'arrive pas à l'utiliser
    Tu pourrais être un peu moins précis stp ?

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 44
    Points : 13
    Points
    13
    Par défaut
    je sais pas, c'est dure de l'être moins

    voilà le code que j'ai !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TiXmlDocument *doc_xml = new TiXmlDocument();
    doc_xml->Parse(ret.buf);
    TiXmlHandle hdl(doc_xml);
    TiXmlElement *elem = hdl.FirstChildElement().Element();
    string chaine=elem->GetText();
    ret.but est un char* contenant mon code xml
    et visiblement j'ai un segfault

  13. #13
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TiXmlElement *elem = hdl.FirstChildElement().Element();
    string chaine=elem->GetText();
    Si (elem ==0) alors "elem->GetText();" -> segfault !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TiXmlElement *elem = hdl.FirstChildElement();
    if(elem)
    string chaine=elem->FirstChild()->ToText()->Value();
    Tu as quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TiXmlElement *elem = hdl.FirstChildElement();
    if(elem)
    string chaine=elem->Attribute("a remplacer par ton nom de noeud");
    Tu as quoi ?

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 44
    Points : 13
    Points
    13
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TiXmlElement *elem = hdl.FirstChildElement();
    if(elem)
    string chaine=elem->FirstChild()->ToText()->Value();
    j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cannot convert `TiXmlHandle' to `TiXmlElement*' in initialization
    si je rajoute le .Element() à la fin de l'initialisation, il me renvoie un false sur le if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TiXmlElement *elem = hdl.FirstChildElement();
    if(elem)
    string chaine=elem->Attribute("a remplacer par ton nom de noeud");
    idem

  15. #15
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 44
    Points : 13
    Points
    13
    Par défaut
    bon, j'ai trouvé, en descendant sur le fils de elem j'arrive a choper quelquechose

    mais je sens que je fais m'arracher les cheveux sur le xml que j'ai a traiter :
    http://uuu.enseirb.fr/~guizani/toto.txt

  16. #16
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Je suis un peu rouillé pour TinyXml, j'ai fait un wrapper TinyXML pour utiliser des "Xpath" simplifiés. Ce qui facilite grandement la récupération de contenu, et je n'utilise que ma surcouche .

    Il y a khayyam qui à fait un article sur TinyXML

    Les handles sont très pratiques.

    Voir la doc TinyXML section Handles

Discussions similaires

  1. [AJAX] Extraire données XML d'un fichier
    Par Borowsky dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 20/06/2008, 11h08
  2. extraire données fichiers xml vers excel
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/06/2008, 10h17
  3. extraire donné fichier txt afficher dans xml
    Par jasminrose dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 01/04/2007, 12h14
  4. Extraire données d'un webservice , xml , php ..
    Par Lettue dans le forum Langage
    Réponses: 1
    Dernier message: 14/09/2006, 19h24
  5. [xml] comment extraire des donnés xml
    Par Lodos dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 20/04/2006, 21h47

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