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 :

Quel parseur XML pour des Strings ?


Sujet :

XML

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut Quel parseur XML pour des Strings ?
    Salut tout le monde,
    je dois faire un programme en C++ qui permet de communiquer avec du flash.
    Je réalise l'interactoin via la méthode ExternalInterface du coté du flash qui me retourne des Strings contenant du XML.

    Jusqu'à présent j'avais pour habitude d'uitliser toujours TinyXML pour tout ce qui est parsing d'XML mais ça ne prend en paramètres d'entrée que des fichiers et pas directement des strings.

    Auriez-vous une autre bibliothèque à me conseiller ? (de préférences légère et fiable)

    merci ++

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Pourquoi ne pas utiliser un fichier temporaire dans ce cas ?

  3. #3
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    en fait, je crains ke ce ne soit trop long. En fait je dois faire communiquer des jeux video en flash avec une plate-forme de jeux video codée elle en C++. A partir de la plate-forme je dois pouvoir etre capable de lancer le jeu flash et de le faire interagir a tout moment avec un serveur (et donc repasser par ma plate forme). Il risque donc d'y avoir beaucoup de données xml a echanger (du jeu flash vers le serveur c++ et vice versa) c'est pour ca que ca me parait pas tres performant d'utiliser des fichiers temporaires.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Je suis quand même surpris que tinyXML ne soit pas capable de 'parser' une chaîne de caractères, alors qu'il peut lire un fichier. La documentation n'est pas très explicite sur ce point, c'est vrai. Je regarderais d'un peu plus près le code néanmoins, je suis convaicu qu'il est possible d'utiliser une chaîne de caractère, ou un flot comme source.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    As-tu testé la fonction suivante à partir d'un document XML stocké sous la forme d'une chaîne de caractère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::istream& operator>>(std::istream & in,TiXmlNode & base);

  6. #6
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    Merci Jan Rendek. J'avoue que je n'y avais pas pensé. Mais es-tu certain que ça marche ? Ce n'est pas que je doute de tes compétences mais c'est juste que je n'ai pas envie de perdre du temps à mettre en place un parser TinyXml (je suis déjà loin d'être en avance sur mon planning ).
    ++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Du tout, je n'ai aucune compétences vis à vis de tinyXML.
    Je partais juste du principe que puisque tu avais l'habitude de cet outil, tester si cette fonction pouvait-être utilisée te ferais gagner du temps. Je pense que ça vaut le coup, parce que j'ai du mal à croire qu'en interne tinyXML ne transforme pas le fichier en flot ou en chaîne de caractère pour pouvoir le manipuler.

    Personnellement, j'utilise xerces. La question que je me pose surtout à la lecture de ton problème c'est de savoir si le choix de DOM par rapport à SAX est justifié.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    J'ai juste lu dans la doc de tinyXML

    "With TIXML_USE_STL on TinyXML supports C++ streams (operator <<,>>) streams as well as C (FILE*) streams"

    donc tu ne devrais pas avoir de probleme...

  9. #9
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par Jan Rendek
    La question que je me pose surtout à la lecture de ton problème c'est de savoir si le choix de DOM par rapport à SAX est justifié.
    +1 Jan Rendek.
    Finalement je vais faire comme tu m'as dit. Au pire, je ne perdrai pas tant de temps que ça. Et puis c'est vrai que SAX c'est plus approprié que DOM.
    ++

  10. #10
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    Je n'arrive pas à utiliser l'opérateur >>...
    Voici mon 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
    void dump_to_stdout(std::string pStr)
    {
      TiXmlDocument *doc;
     
      // initialisation
      doc = new TiXmlDocument();
     pStr >> doc;
     
      // parsing
      dump_to_stdout(doc);
     
      // liberation de la memoire
      delete doc;
      doc = 0;
    }
    Et voici l'erreur qu'il me sort (j'uis sous Code::Blocks):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error: no match for 'operator>>' in '&pStr >> *doc'
    C:/Program Files/CodeBlocks/include/TinyXml/tinyxml.h:429: note: candidates are: std::istream& operator>>(std::istream&, TiXmlNode&)
    Si quelqu'un veut bien m'aider je lui en serai infiniment reconnaissant !
    ++

  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
    Difficile d'être plus explicite que le compilateur.

    L'opérateur >> attend un std::istream à gauche et un TiXmlNode& à droite.

    Toi tu fournis un std::string à gauche et un TiXmlDocument* à droite, ça n'a donc rien à voir.

    Je n'ai jamais utilisé ça, mais j'imagine que ça devrait être un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void dump_to_stdout(const std::string& Str)
    {
        TiXmlNode Node;
     
        std::istringstream iss(Str);
        if (iss >> Node)
        {
            // Là tu as chargé ton XML dans Node
        }
    }

  12. #12
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    ok c'est bon j'avais juste un problème de référence.
    Voila le code qui marche:
    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
    void dump_to_stdout(std::string pStr)
    {
      TiXmlDocument *doc;
      std::istringstream iss(pStr);
     
      // initialisation
      doc = new TiXmlDocument();
      iss >> (*doc);
     
      // parsing
      dump_to_stdout(doc);
     
      // liberation de la memoire
      delete doc;
      doc = 0;
    }
    Merci tout le monde
    ++

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu m'expliques pourquoi t'utilises new ?
    Pour rendre le code plus lent et poser des problèmes de libération, en particulier face à des exceptions ?

    Voici un code déjà plus correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void dump_to_stdout(const std::string& str) // inutile de copier la chaîne
    {
      TiXmlDocument doc;
      std::istringstream(str) >> doc; // on fait un flux seulement temporaire pour qu'il soit libéré avant d'appeler dump_to_stdout
     
      // parsing
      dump_to_stdout(&doc);
    }
    Cependant en regardant la doc ils disent d'éviter d'utiliser cela car leur implémentation est lente.
    Ils conseillent à la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void dump_to_stdout(const std::string& str)
    {
      TiXmlDocument doc;
      doc.Parse(str.c_str());
     
      // parsing
      dump_to_stdout(&doc);
    }
    Tu devrais aussi faire prendre une référence à ton autre version de dump_to_stdout et dans ce cas virer les &.

  14. #14
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    ok merci loufoque et encore désolé d'avoir ouvert un second poste ressemblant.

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

Discussions similaires

  1. Modification de compareTo pour des String?
    Par Greg.shogun dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 29/01/2007, 10h35
  2. Réponses: 2
    Dernier message: 06/09/2006, 14h26
  3. [SimpleXML] Problème PHP5/XML pour des affichages particuliers
    Par vanilla dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 20/04/2006, 13h22
  4. Quel langage utiliser pour des formulaires ?
    Par le_ben dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 13/10/2005, 14h08
  5. Réponses: 8
    Dernier message: 19/04/2005, 12h04

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