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

Qt Discussion :

Traitement des données XML sur serveur distant.


Sujet :

Qt

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut Traitement des données XML sur serveur distant.
    Bonjour à tous,

    Voilà ce que j'ai fait avec jmartin pour le traitement des données XML.

    Mais ça ne fonctionne toujours pas après plusieurs recherche sur la doc et sur le forum j'ai rien trouvé de plus...

    Je voudrais faire en sorte que mon programme envoie une requête par la méthode post avec les infos de connexion au site, une fois cette étape faite sur le script on va recevoir des informations XML, troisième étapes traiter c'est information tel que :

    - Récupérer toutes les balises entre les balises <utilisateur> et </utilisateur> (afin d'éviter si je rajoute une infos xml dans mon script de devoir faire une mise à jours du programme juste pour une balise...)
    - Afficher les information dans un QMessageBox.

    j'ai pas très très bien fait la requête post à mon avis parce que j'ai aucun moyen pour l'instant de savoir si je suis connecté au serveur ou si je ne le suis pas.

    Voici le 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <QtGui>
    #include <QtNetwork>
    #include <QHttp>
    #include <QtXml>
    #include <QtDebug>
    #include "tool.h"
     
    void Tool::on_pushButton_connection_clicked()
    {
        http = new QHttp(this); // variable de la class Http
     
        connect(&http, SIGNAL(done(bool)), this, SLOT(affiche(bool)));
        connect(&http, SIGNAL(requestFinished(int, bool)), this, SLOT(fin(int, bool)));
     
        QHttpRequestHeader header("POST", "/page.php");
        header.setValue("Host", "www.site.fr");
     
        http->setHost("www.site.fr");
        header.setValue( "User-Agent", "User Agent");
        header.setContentType("application/x-www-form-urlencoded");
     
        QString PostVariable = "username=";
        PostVariable+=uiConfig.lineEdit_2->text();
        PostVariable+="&password=";
        PostVariable+=QCryptographicHash::hash(uiConfig.lineEdit->text().toUtf8(),QCryptographicHash::Sha1).toHex();
        PostVariable+=uiConfig.lineEdit->text();
     
        http->request(header,PostVariable.toUtf8());
    }
     
    void Tool::fin(int _id, bool _error)
    {
        if(_error)
            QMessageBox::information(0, "Fin", QString().setNum(http->error()));
    }
     
    void Tool::affiche(bool)
    {
        QDomDocument infos;
        QString errorStr;
        int errorLine;
        int errorColumn;
        QByteArray content = http->readAll();
        if (!infos.setContent(content, true, &errorStr, &errorLine, &errorColumn))
        {
            qDebug() << "Error parsing session file";
            qDebug() << content;  return;
        }
     
        QDomElement element = infos.documentElement();
        for(QDomNode n = element.firstChild();
        !n.isNull();
        n = n.nextSibling())
        {
            QDomElement e = n.toElement();
            qDebug() << e.tagName() << e.text();
            QMessageBox::information(0, tr("Programme"), e.tagName());
        }
    }
    Mais j'ai rien du tout je n'arrive pas à savoir si ça fonctionne ou si ça ne fonctionne pas...

  2. #2
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Tes connexions de slots/signaux semblent inexactes : tu dois connecter http et non &http.
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    /!\ à chaque appel de on_pushButton_connection_clicked()
    tu créé un nouveau QHttp. Et tu ne semble le détruire nulle part.

    Pourquoi utiliser un pointeur ici?

    comme seul ta class l'utilise autant éviter de compliquer les choses

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    J'ai modifié juste &http en http et ça ma affiché le contenu de la variable !

    Le seul souci maintenant que j'ai c'est surement le plus important...

    Avait vous une solution pour faire en sorte d'afficher dans un message QMessageBox ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Une nouvelle news vient d\'être postée "{NEWS_TITRE}" de {NEWS_AUTEUR}.\nCliquez ici pour la lire !
    Quand on clique sur "ici" on arrive sur la page internet.


    Car je récupère sur mon script PHP les informations comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <news>
        <news_auteur>bertrand</news_auteur>
        <news_titre>ohh une nouvelle planche viens d'arriver !!</news_titre>
        <news_lien>http://www.site.fr/forum/45613</news_lien>
    </news>
    Je n'ai pas encore trouvé le moyen de faire ceci, gros problème de logique en ce moment...
    Sachant que je voudrais que le programme n'est pas les nom de variable comme ça je pourrais faire en sorte de rajouter des nouvelles balises quand je veux sans devoir faire une mise à jour du programme mais je pense que ça va devenir impossible...

    PS : Quand j'ai un message je reçoit toutes les balise news_auteur, news_titre, news_lien a la suite. Je ne trouve pas le moyen de les afficher cas un certain endroit.


    Aussi je voudrais savoir, la requête devrait se faire toute les x minutes avec un Qtimer donc je pensais faire un Qtimer de la classe on_pushButton_connection_clicked() mais les information utilisateur soit pseudo et mot de passe je ne les aurait plus ?

    Donc qu'elle est la meilleur façon de les conserver ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Après avoir essayé de réaliser cette fonction, je me suis aperçu qu'il y avait un problème de logique...

    Enfaite je récupère tout les noms de balise exemple "news" qui va contenir plusieurs balises "news_auteur", "news_lien", "news_titre" etc... donc jusque là ça va.

    Le problème c'est que je suis obligé enfaite de définir dans le code le nom de balise vu que je voudrais faire ça au final :

    Exemple bidon qui ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QPopup *t = new QPopup(200,200,1);
    t->Show(QString("Programme"), QString("news_auteur" a écrit : + "news_titre" + clic ici pour aller voir "news_lien"),5000);
    Donc pour faire ça il faut que je récupère aussi les petites balises XML contenu dans chaque grosse balise.

    Donc jusque là je n'ai pas besoins de mettre un nom de balise dans le code...
    Mais par contre quand je vais vouloir afficher résultat par résultat je vais devoir justement définir le nom des balises !

    N'y a t-il pas une méthode, astuce qui me permettrais de ne pas définir les noms des balises XML dans le programme ?

  6. #6
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Non. Si tu veux lire quelque chose, ton programme doit savoir d'où le tirer.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Donc si je rajoute par exemple une balise XML je vais être obligé de fournir une nouvelle version du programme !?

  8. #8
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Oui, c'est pour ça qu'il existe les DLLs (tu fournis juste le plugin).

    Autre solution, tu rend le parsing dépendant d'un petit script (que ce soit avec Qt Script qui a l'avantage d'être aisément intégrable avec une appli Qt, ou par des outils plus traditionnels) qui s'occuperait de décrire le parsing et la façon de rapporter les infos dans l'interface. Il ne te resterait plus qu'au démarrage de l'appli à vérifier si une version plus récente de ton script est dispo, auquel cas tu en fais la mise à jour depuis l'appli (par QHttp par exemple).

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    bon je vais faire une mise à jour à chaque fois je pense que ce sera le plus rapide déjà et que se sera aussi le moins lourd.

    Donc j'ai vais comme ceci j'ai essayé de l'optimiser le plus possible :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    void Tool::affiche(bool)
    {
        QDomDocument infos;
        QString errorStr;
        int errorLine;
        int errorColumn;
        QByteArray content = http->readAll();
        if (!infos.setContent(content, true, &errorStr, &errorLine, &errorColumn))
        {
            qDebug() << "Erreur d'analyse du fichier de session";
            qDebug() << content;  return;
        }
     
        QDomElement element = infos.documentElement();
        for(QDomNode n = element.firstChild();
        !n.isNull();
        n = n.nextSibling())
        {
            QDomElement e = n.toElement();
            qDebug() << e.tagName() << e.text();
     
            if(e.tagName() == "connecte")
            {
                QTimer *timer = new QTimer(this);
                connect(timer, SIGNAL(timeout()), this, SLOT(requete_http()));
                timer->start(420000); // 10 minutes = 600000 millisecondes
                QMessageBox::information(0, tr("news"), tr("Beuh !"));
            }
     
            if(e.tagName() == "news")
            {
                QString news_auteur = e.attribute("news_auteur");
                QString news_titre = e.attribute("news_titre");
                QString news_lien = e.attribute("news_lien");
     
                QMessageBox::information(0, tr("news"), news_auteur + "\n" + news_titre + "\n" + news_lien);
            }
            if(e.tagName() == "post")
            {
                QString post_auteur = e.attribute("post_auteur");
                QString post_titre = e.attribute("post_titre");
                QString post_lien = e.attribute("post_lien");
     
                QMessageBox::information(0, tr("post"), post_auteur + "\n" + post_titre + "\n" + post_lien);
                QMessageBox::information(0, tr("blabla"), tr("Coucou"));
            }
        }
    }
    ÉDIT : J'ai mis un QString ça ne m'affiche plus d'erreur lors de la compilation mais ça ne fonctionne toujours pas...

    Si j'ai pas fait la meilleur méthode pouvez vous me le dire s'il vous plait.

    Merci !

  10. #10
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Le type post n'est pas connu :/

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Je ne sais pas comment faire enfin je bloque je sais pas quoi mettre pour récupéré les balises enfants...

    Je sais que c'est logique que ça bug mais je ne vois pas par quoi changer ça.

  12. #12
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    #include <post.h> ?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    J'ai réussit à le faire marcher.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    J'ai un nouveau problème maintenant avec une condition et un bool qui ne fonctionne pas...

    Enfaite mon premier problème c'est que je voudrais afficher deux balises XML dans un message donc je fais comme ceci :
    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
     
    if(e.tagName() == "connecte" && e.tagName() == "pseudo")
            {
                QTimer *timer = new QTimer(this);
                connect(timer, SIGNAL(timeout()), this, SLOT(requete_http()));
                timer->start(420000); // 10 minutes = 600000 millisecondes
     
                if(premiere_connexion = true)
                {
                    QString connecte = e.firstChildElement("connecte").text();
                    QString pseudo = e.firstChildElement("pseudo").text();
     
                    QMessageBox::information(0, tr("Connecté"), connecte + "\n" + pseudo);
                    QMessageBox::information(0, tr("Connecté"), tr("Coucou !"));
     
                    premiere_connexion = false;
                }
            }
    Donc ça devrait marcher vu que j'ai ceci dans mon fichier XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <utilisateur>
        <pseudo>Austin</pseudo>
        <connecte>Vous êtes connecté !</connecte>
    </utilisateur>
    Mais ça ne fonctionne pas... j'ai rien qui ne se passe par contre si je mets seulement : if(e.tagName() == "connecte") là ça fonctionne très bien !


    Deuxième problème avec le bool.
    Je voudrais faire en sorte d'afficher le message de la balise connecte et pseudo que lors de la première requête !
    Donc j'ai fait un bool au tout début de ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Tool::Tool()
    {
        ...
     
        // Dit que l'on n'a pas encore fait de connexion HTTP.
        premiere_connexion = true;
    }
    ensuite je fais ceci pour dire si c'est true alors c'est la première requête si false ce n'est pas la première 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
     
    if(e.tagName() == "connecte")
            {
                QTimer *timer = new QTimer(this);
                connect(timer, SIGNAL(timeout()), this, SLOT(requete_http()));
                timer->start(420000); // 10 minutes = 600000 millisecondes
     
                if(premiere_connexion = true)
                {
                    QMessageBox::information(0, tr("Test"), tr("Coucou !"));
     
                    premiere_connexion = false;
                }
            }
    Ca ne prend pas en compte le false car j'ai toujours le message "Test" peu importe si c'est la première ou la 20ème requête...

    Merci !

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Points : 24
    Points
    24
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(premiere_connexion = true)
    Euh c'est == et non juste =

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(premiere_connexion == true)
    ou alors :


  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Merci "==" fonctionne mais pas t'as dernière réponse !

    Reste plus que le problème : (e.tagName() == "connecte" && e.tagName() == "pseudo").

  17. #17
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par austin.fla Voir le message
    Reste plus que le problème : (e.tagName() == "connecte" && e.tagName() == "pseudo").
    Ce sera toujours faux ça, relis le encore une fois.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Tu es bien d'accord avec moi que cette condition fait :

    si la balise "connecte" et "pseudo" sont présente alors j'effectue le message.

    Non ?

  19. #19
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Points : 24
    Points
    24
    Par défaut
    Personnellement je ne le vois pas comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (e.tagName() == "connecte" && e.tagName() == "pseudo")
    Si e.tagName() égale "connecte" et e.tagName() égale "pseudo"

    Tu trouves pas qu'il y a une erreur lol ?

    autrement pour le if(premiere_connexion) si premiere_connexion est de type bool ça devrait marché.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Je comprends pas l'erreur je dois avoir un manque de logique...

    Je voudrais faire : si il y a la balise connecte et pseudo alors j'affiche leur contenu.

Discussions similaires

  1. [XL-2007] macro pour recupérer des données xml sur excel
    Par gibba88 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/05/2012, 21h03
  2. Rapatriement des données sur serveur distant
    Par weebo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/09/2011, 11h29
  3. [DOM] parsing de xml et traitement des données
    Par vincent62149 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 04/03/2008, 10h06
  4. Traitement des données formatées en XML
    Par cedricnguessi dans le forum Autres éditeurs
    Réponses: 14
    Dernier message: 10/07/2006, 13h21
  5. [VB.NET] Connexion à une base de données sur serveur distant
    Par boulete dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/04/2006, 14h11

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