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 :

[TinyXML2] LoadFile ne fonctionne pas


Sujet :

XML

  1. #1
    Futur Membre du Club
    [TinyXML2] LoadFile ne fonctionne pas
    Bonjour à tous,

    Je tente d'utiliser la bibliothèque TinyXml2 pour récupérer les informations d'un xml.
    Je travaille sous Linux avec QtCreator.

    Voilà ce qui se passe : j'utilise un QFileDialog::getOpenFileName pour récupérer le chemin vers mon fichier xml. Jusque là, tout se passe bien, je récupère un QString.

    Ensuite, je le passe en string, puis en char, car, d'après ce que j'ai compris, la fonction LoadFile de TinyXml prend des char en entrée. Mais quand je compile, l'erreur suivante est renvoyée : "no matching function to call to tinyxml2::XMLDocument::LoadFile(QString&)". Du coup j'ai aussi essayé en passant directement le chemin du xml en tant que QString et string, mais rien, ça ne marche pas non plus.

    Voici un bout du code.

    Au tout début du fichier :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <tinyxml2.h>
    #define TIXML_USE_STL


    Puis :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # Recuperation du chemin du fichier xml
    QString xml_path;
    xml_path=QFileDialog::getOpenFileName(this,QObject::tr("Select xml file"), "/home",QObject::tr("XML files (*.xml)"));
     
    # Creation du document xml qui sera manipulé
    tinyxml2::XMLDocument xml_Doc;
     
    # Passage du chemin de QString en char
    xml_path=(char*)xml_path.toUtf8().constData();
     
    # Chargement du fichier xml
    xml_Doc.LoadFile(xml_path);


    Voilà voilà. Quelqu'un a une idée ? Merci d'avance.

  2. #2
    Expert confirmé
    xml_path est de type QString. Les objets ne mutent pas en C++, ils conservent le type avec lequel ils ont été déclarés toute leur durée de vie. Il faut passer directement xml_path.toUtf8().constData() (de type const char *) à tinyxml.

    Mais tu te compliques la vie : pourquoi utiliser un parser XML tiers sur un projet Qt plutôt que la solution Qt dédiée ?

  3. #3
    Futur Membre du Club
    Ok merci, effectivement ça marche !
    Je n'utilise pas la solution Qt car je n'y comprends pas grand chose ! Il y a beaucoup beaucoup de méthodes, de membres et c'est difficile de trouver de quoi j'ai réellement besoin. Utiliser TinyXml, qui contient vraiment le stricte nécessaire me semblait plus simple. Il y a peu de commandes et il est plus facile de s'y retrouver. J'ai seulement besoin d'écrire des xml et de récupérer les valeurs contenues à l'intérieur. Et puis comme ça j'ai découvert comment importé une bibliothèque sous Qt, au passage...

    Merci pour la réponse, ça marche très bien !
    Bonne journée à vous !

  4. #4
    Expert confirmé
    C'est toi qui voit. Soit dit en passant ce n'est pas en lisant la doc qu'on détermine ce dont on a besoin. On écrit l'algo en amont, on détermine les opérations nécessaires et on consulte ensuite la documentation pour comprendre comment la solution technique va permettre d'implémenter ces opérations.

  5. #5
    Expert confirmé
    Personnellement, ayant utilisé QDomDocument de Qt et TinyXML, je trouve TinyXML à la fois plus pratique et bien mieux documenté.

    Cependant, tous les deux chargent en mémoire le XML entier, ce qui n'est pas le cas de QXmlStreamReader de Qt.

    Edit :

    Citation Envoyé par cestquoica Voir le message
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <tinyxml2.h>
    #define TIXML_USE_STL
    Le #define TIXML_USE_STL ne doit pas être là.
    Si tu veux pouvoir utiliser les fonctions de TinyXML qui acceptent en paramètre des types de la STL, il faut que TIXML_USE_STL soit défini :
    • pour compiler les cpp de TinyXML (sinon, lesdites fonctions ne seront pas définies) et
    • avant d'inclure les .h de TinyXML (sinon, lesdites fonctions ne seront pas déclarées).

    En fait, si les cpp de TinyXML appartiennent à la liste des cpp de ton projet, il faut ajouter TIXML_USE_STL dans les définitions conditionnelles du projet. L'effet sera le même que si chaque cpp de ton projet commence par #define TIXML_USE_STL.

###raw>template_hook.ano_emploi###