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 XML trop long et plante


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 XML trop long et plante
    Bonsoir

    J'ai un nouveau problème...
    Je traite mon fichier xml tout va bien mais j'ai rajouté pas mal de petite balise à traiter et là par contre ça plante...

    Je sais pas pourquoi quand on en met trop ça ne fonctionne plus...
    J'utilise SAX faut il que je passe sur DOM ?

    Voilà le code pour vous donnez une idée de la longueur si jamais c'est pas le problème du nombre de balise :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    void FenInfos::traitement_xml()
    {
        QList<QString> results;
     
        QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
        QXmlStreamReader reader(reply->readAll());
        reader.readNext();
     
        reader.readNext();
        while (!reader.atEnd())
        {
            if (reader.isStartElement())
            {
                if (reader.name() == "root")
                {
                    reader.readNext();
                    while(reader.isStartElement()==false)
                        reader.readNext();
     
                    if(reader.name() == "film")
                    {
                        reader.readNext();
                        while(reader.isStartElement()==false)
                        reader.readNext();
     
                        if(reader.name() == "titre")
                        {
                            QString Titre = reader.readElementText();
                            results.append(Titre);
     
                            reader.readNext();
                            while(reader.isStartElement()==false)
                            reader.readNext();
                        }
                        else if(reader.name() == "date_sortie")
                        {
                            QString Date_sortie = reader.readElementText();
                            results.append(Date_sortie);
     
                            reader.readNext();
                            while(reader.isStartElement()==false)
                            reader.readNext();
                        }
                        else if(reader.name() == "realise_par")
                        {
                            QString Realise_par = reader.readElementText();
                            results.append(Realise_par);
     
                            reader.readNext();
                            while(reader.isStartElement()==false)
                            reader.readNext();
                        }
                        else if(reader.name() == "titre_original")
                        {
                            QString Titre_original = reader.readElementText();
                            results.append(Titre_original);
     
                            reader.readNext();
                            while(reader.isStartElement()==false)
                            reader.readNext();
                        }
                        else if(reader.name() == "genre")
                        {
                            QString Genre = reader.readElementText();
                            results.append(Genre);
     
                            reader.readNext();
                            while(reader.isStartElement()==false)
                            reader.readNext();
                        }
                        else if(reader.name() == "duree")
                        {
                            QString Duree = reader.readElementText();
                            results.append(Duree);
     
                            reader.readNext();
                            while(reader.isStartElement()==false)
                            reader.readNext();
                        }
                        else if(reader.name() == "annee_production")
                        {
                            QString Annee_production = reader.readElementText();
                            results.append(Annee_production);
     
                            reader.readNext();
                            while(reader.isStartElement()==false)
                            reader.readNext();
                        }
                        else if(reader.name() == "distributeur")
                        {
                            QString Distributeur = reader.readElementText();
                            results.append(Distributeur);
     
                            reader.readNext();
                            while(reader.isStartElement()==false)
                            reader.readNext();
                        }
                        else if(reader.name() == "synopsis")
                        {
                            QString Synopsis = reader.readElementText();
                            results.append(Synopsis);
     
                            reader.readNext();
                            while(reader.isStartElement()==false)
                            reader.readNext();
                        }
                        else if(reader.name() == "lien_image")
                        {
                            QString Lien_image = reader.readElementText();
                            results.append(Lien_image);
                        }
                    }
                }
            }
            reader.readNext();
        }
        reply->deleteLater();
        affichage(results);
    }
    Et le fichier XML est comme ceci : (je pense que le plantage vient surtout de synopsis mais c'est pas toujours le cas mais en tout cas quand je le mets sa plante direct.
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <root>
    	<film>
    		<titre>Shooter tireur d'élite</titre>
    		<date_sortie>18 avril 2007</date_sortie>
    		<realise_par>Antoine Fuqua</realise_par>
    		<titre_original>Shooter</titre_original>
    		<genre>Action</genre>
    		<duree>02h04min</duree>
    		<annee_production>2007</annee_production>
    		<distributeur>Paramount Pictures France</distributeur>
    		<synopsis><![CDATA[L'éclaireur et tireur d'élite Bob Lee Swagger s'est couvert de gloire sur divers fronts avant qu'une odieuse trahison ne l'amène à quitter les Marines et à se couper du monde. Reclus dans un chalet, au sommet d'une montagne quasi inaccessible, Swagger pense avoir tourné la page et se croit désormais à l'abri de toute nouvelle mésaventure.
    Mais lorsque le colonel Isaac Johnson vient le relancer et lui demande une fois de plus son aide pour déjouer un complot imminent contre le Président des Etats-Unis, le "shooter" ne peut se dérober à son devoir.
    Comment pourrait-il anticiper le piège diabolique qui lui est tendu et deviner qu'il va bientôt se retrouver accusé de tentative de meurtre ? Traqué à travers tout le pays par une meute de mercenaires, il est obligé de mobiliser toutes ses ressources pour survivre, retrouver son honneur et déjouer la plus terrifiante des conspirations.]]></synopsis>		
    		<lien_image>http://images.allocine.fr/r_160_214/b_1_cfd7e1/medias/nmedia/18/63/77/83/18750618.jpg</lien_image>
    	</film>
    </root>
    Merci !

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 605
    Points
    188 605
    Par défaut
    DOM ou SAX, il faut voir si ton fichier sera gros ou pas, si tu peux utiliser beaucoup de mémoire ou pas : le parseur DOM charge l'entièreté du document, le parseur SAX le traite balise par balise.

    Pour ton plantage, peut-être mettre du <![CDATA[ ]]> autour de ton texte ? Il y a peut-être dedans des caractères que le parseur ne s'attend pas à trouver, il plante donc.

    Une autre possible cause, ton abondance de if : if(a == b) ; if(a == c)... À chaque fois, tu réévalues a et tu passes par tous les if : le PC commence par le premier, puis passe au deuxième, etc., inconditionnellement. Si tu mest des elseif, tu lui dis de ne vérifier le prédicat suivant que si l'actuel ne renvoit pas true.

    Vérifie aussi que ton XML est valide (validator.w3.org).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    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 il faut toujours mettre <![CDATA[ ]]> autour du texte c'est plus sûre c'est bien ça ?

    Pour l'histoire des if comment je peux faire autrement du coup ?

    Merci de ta réponse

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 605
    Points
    188 605
    Par défaut
    Les CDATA surtout quand tu peux avoir des caractères spéciaux. Si ça reste dans azAZ09, pas de problème ; dès que tu vas en dehors, prends des pincettes.

    En if, tu pourrais mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(reader.name() == "titre")
    elseif(reader.name() == "date_sortie")
    elseif(reader.name() == "realise_par")
    ...
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  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
    C'est vrai que j'ai pas du tout pensé au elseif ^^
    Merci

    Et je vais mettre CDATA de toutes façon sa ne pose pas de ralenti sur la génération du XML si ?

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 605
    Points
    188 605
    Par défaut
    Normalement, ça ne ralentit que le téléchargement vu que tu as quelques octets à chaque fois qui passent en plus ; niveau vitesse de parsage, ce sera évidemment plus lent vu qu'il y aura plus de contenu mais aussi plus rapide vu que le parseur ne cherchera pas de balise dans le CDATA. Au final, ça doit être un statu quo ; à voir si ça résoudra ton problme.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  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
    Ok d'accord merci

    Par contre je vois pas l'utilité de "reader.readNext();" 5 ligne avant la fin de code c++

    Vu qu'il y a qu'une seul balise root pourquoi refaire readNext ?
    Je l'ai mise vu que dans le tuto sur la SAX le développeur la mis mais je vois pas l'utilité... Peut être que tu seras la réponse

    Merci en tout cas pour ton aide !

  8. #8
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 605
    Points
    188 605
    Par défaut
    Si on parle bien du même (l'antépénultième instruction), alors la FAQ Qt répond parfaitement à cette question :

    Citation Envoyé par http://qt.developpez.com/faq/?page=SAX#QXmlStreamReader
    Qt fourni, depuis sa version 4.3, la classe QXmlStreamReader qui permet de lire rapidement des fichiers XML un peu à la manière de SAX mais en non événementiel. Comme SAX, on parcourt l'arbre XML et l'on ne peut le remonter pendant son parcours. QXmlStreamReader repose sur le principe d'une boucle dans laquelle on va parcourir le fichier à l'aide de la méthode readNext() et vérifier sur quel type de token on est positionné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reader.readNext(); // On va au prochain token
    Tu fais une boucle. Cette instruction correspond à peu près à l'incrémentation du compteur utilisé dans le gardien de la boucle for. Sinon, tu vas rester ad vitam aeternam au même élément, tu ne vas pas avancer beaucoup... Prends un livre et lis-le : tu as une boucle qui fait que, à chaque fin de ligne, tu passes à la suivante. Enlève cette instruction et tu ne passes plus à la ligne suivante.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  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
    Ah oui ok d'accord je partais du principe que vu qu'on traiter toute les balises pas besoin d'aller à la suivante, enfaite je me suis complètement embrouillé...

    Merci beaucoup pour ton aide je vais essayé tout ça dès que je rentre ! Merci !!

    Edit : ça marche parfaitement Merci !!

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

Discussions similaires

  1. Temps de traitement select trop long
    Par David79 dans le forum Requêtes
    Réponses: 1
    Dernier message: 19/05/2013, 11h37
  2. Traitement LDAP trop long!
    Par ludojojo dans le forum C#
    Réponses: 12
    Dernier message: 05/05/2011, 10h29
  3. Traitement de message trop long C++/WINAPI
    Par sex4fun dans le forum C++
    Réponses: 4
    Dernier message: 12/02/2008, 10h15
  4. Temps de Traitement trop long
    Par RGShoop dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/06/2007, 15h41
  5. [Système] Traitement trop long, géré le timeout
    Par Oberown dans le forum Langage
    Réponses: 2
    Dernier message: 01/08/2006, 08h44

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