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 :

Qt + parcours fichier xml


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 26
    Points
    26
    Par défaut Qt + parcours fichier xml
    Bonjour,
    je souhaite parcourir mon fichier xml pour recueillir des informations.

    Mon fichier xml est 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <historique>
      <jour>
         <date> </date>
         <unHisto> 
             <url> </url>
             <nom> </nom>
             <heure> </heure>
         </unHisto>
         <unHisto> 
             <url> </url>
             <nom> </nom>
             <heure> </heure>
         </unHisto>
      </jour>
    <jour>
         <unHisto> 
             <url> </url>
             <nom> </nom>
             <heure> </heure>
         </unHisto>
    </jour>
    </historique>
    J'enregistre dans mon fichier xml l'historique des pages visitées par l'utilisateur.

    J'ai fais :
    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
     
     QDomDocument doc;
    QFile file("historique.xml");
    file.open(QIODevice::ReadOnly);
    doc.setContent(&file);
    file.close();
     
    QDomElement root = doc.documentElement();
     
    QDomElement child = root.firstChild().toElement();
     
        while(!child.isNull())
        {
            if (child.tagName() == "jour")
            {
                QDomElement grandChild = child.firstChild().toElement();
                while(!grandChild.isNull())
                {
                    if (grandChild.tagName() == "date")
                    {
                        QDomElement grandGrandChild = grandChild.firstChild().toElement();
                        while(!grandGrandChild.isNull())
                        {
                            if (grandGrandChild.tagName() == "unHisto")
                            {
                                QDomElement grandGrandGrandChild = grandGrandChild.firstChild().toElement();
                                while(!grandGrandGrandChild.isNull())
                                {
                                    if (grandGrandGrandChild.tagName() == "url")
                                    {
                                        listeUrl << grandGrandGrandChild.text();
                                        splitUrl(grandGrandGrandChild.text());
                                    }
                                    grandGrandGrandChild = grandGrandGrandChild.nextSibling().toElement();
                                }
     
                            }
                            grandGrandChild = grandGrandChild.nextSibling().toElement();
                        }
     
                    }
                    grandChild = grandChild.nextSibling().toElement();
                }
            }
        }

    En fait, je souhaite mettre le contenu de mes balises <url> dans ma liste.

    Ce parcours me parait un peu long parce que ça fait planter mon appli :p

    Si quelqu'un à une idée ^^

    Merci d'avance

  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 : 40
    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
    Implémentes QXmlStreamReader : c'est ce qu'il y a de plus adapté.

    Plus d'infos : http://qt.developpez.com/doc/4.5/qtxml/

  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
    bientôt dans la faq
    Citation Envoyé par superjaja
    Comment lire un fichier XML avec QXmlStreamReader
    Qt founi depuis sa version 4.3 la classe QXmlStreamReader qui permet de lire rapidement des fichiers XML un peu à la maniere de SAX mais en non evenementiel. Comme SAX on parcours 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 methode readNext() et verifier sur quel type de token on est positionné.

    Exemple avec le fichier XML suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <developpez>
        <contributeur>Superjaja</contributeur>
    </developpez>
    Si l'on parcours le fichier avec la methode readNext() les differents types de token renvoyés sont:

    -StartDocument
    -StartElement (name() == "developpez")
    -StartElement (name() == "contributeur")
    -Characters (text() == "Superjaja")
    -EndElement (name() == "contributeur")
    -EndElement (name() == "developpez")
    -EndDocument

    Pour connaitre tout les types de tokens possible se référer à la documentation Qt ici.

    Exemple de parcours d'un fichier XML simple :

    XML :

    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"?>
    <root>
        <site>
            <nom>developpez</nom>
            <url>www.developpez.com</url>
        </site>
        <contributeur>
            <nom faq="c++">Alp</nom>
        </contributeur>
        <contributeur>
            <nom faq="Qt">Mongaulois</nom>
        </contributeur>
    </root>

    Parcours de ce fichier avec QXmlStreamReader :

    C++ :

    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
     
    QXmlStreamReader reader;//Objet servant à la navigation
    QString fileName = "developpez.xml";
    QFile file(fileName);
    file.open(QFile::ReadOnly | QFile::Text); //Ouverture du fichier XML en lecture seul et en mode texte
    reader.setDevice(&file);//Initialise l'instance reader avec le flux XML venant de file
     
     
    //Le but de cette boucle est de parcourir le fichier et de vérifier si l'on est au debut d'un element.
    reader.readNext();
    while (!reader.atEnd())
    {		
    	if (reader.isStartElement()) 
    	{	
    		if (reader.name() == "root") 
    		{	
    			reader.readNext();//On va au prochain token
    			while(reader.isStartElement()==false)//Tant que celui-ci n'est pas un element de depart on avance au token suivant.
    				reader.readNext();
     
    			if(reader.name() == "site")
    			{
    				reader.readNext();
    				while(reader.isStartElement()==false)
    					reader.readNext();
     
    				if(reader.name() == "nom")
    				{
     
    					QString strNom = reader.readElementText();
    					reader.readNext();
    					while(reader.isStartElement()==false)
    						reader.readNext();
    				}
    				if(reader.name() == "url")
    				{
    					QString strUrl = reader.readElementText();
    				}
     
    			}
    		} 
     
    		if(reader.name() == "contributeur")
    		{
    			reader.readNext();
    			while(reader.isStartElement()==false)
    				reader.readNext();
    			if(reader.name() == "nom")
    			{
    				QString attrFAQ = reader.attributes().value("faq").toString();
    				QString strNameContrib = reader.readElementText();
    			}
    		}
     
    	}
    	reader.readNext();//On va au prochain Token
    }
    file.close();
    Y'as aussi avec DOM, mais je ne sais pas si c'est pertinent dans ton cas

  4. #4
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Alors yan tu fais du teasing au sujet de la mise à jour de la FAQ .

    sofuzion si tu as des problèmes à implémenter QXmlStreamReader tiens nous au courant.

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup
    Je vais regarder avec ça !
    Je vous tiens au courant

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 26
    Points
    26
    Par défaut
    Bonjour,
    j'ai essayé par rapport à l'exemple que vous m'avez donné ci-dessus,
    j'arrive bien à récupérer ma première url contenu dans xml, par contre, ensuite je n'y parviens pas ... je pense que je dois avoir un problème au niveau des reader.readNext() .. mais je ne comprends pas.

    Une partie de mon xml :
    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
     
    <historique>
     <jour>
      <date>vendredi 6 mars 2009</date>
      <unHisto>
       <url>http://www.google.com/</url>
       <heure>11:03:56</heure>
       <nom>Google</nom>
      </unHisto>
      <unHisto>
       <url>http://www.facebook.com/</url>
       <heure>11:03:56</heure>
       <nom>facebook</nom>
      </unHisto>
     </jour>
     <jour>
      <date>dimanche 15 mars 2009</date>
      <unHisto>
       <url>http://www.google.fr/</url>
       <heure>13:59:08</heure>
       <nom>Google</nom>
      </unHisto>
      <unHisto>
       <url>http://www.google.fr/</url>
       <heure>13:59:09</heure>
       <nom>Google</nom>
      </unHisto>
      <unHisto>
       <url>http://www.google.fr/</url>
       <heure>13:59:09</heure>
       <nom>Google</nom>
      </unHisto>
      <unHisto>
       <url>http://www.archeduvaldesambre.com/</url>
       <heure>14:25:28</heure>
       <nom>L'Arche du Val de Sambre</nom>
      </unHisto>
      <unHisto>
       <url>http://www.archeduvaldesambre.com/</url>
       <heure>14:25:31</heure>
       <nom>L'Arche du Val de Sambre</nom>
      </unHisto>
     </jour>
     <jour>
    et 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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    QXmlStreamReader reader;
     
        QFile file("historique.xml");
        file.open(QFile::ReadOnly | QFile::Text); 
        reader.setDevice(&file);
     
        reader.readNext();
        while (!reader.atEnd())
        {
            if (reader.isStartElement())
            {
                if (reader.name() == "historique")
                {
                    reader.readNext();
                    while(reader.isStartElement()==false)
                        reader.readNext();
     
                    if(reader.name() == "jour")
                    {
                        reader.readNext();
                        while(reader.isStartElement()==false)
                            reader.readNext();
     
                        if(reader.name() == "date")
                        {
                            reader.readNext();
                            while(reader.isStartElement()==false)
                                reader.readNext();
                        }
                        if(reader.name() == "unHisto")
                        {
                            reader.readNext();
                            while(reader.isStartElement()==false)
                                reader.readNext();
     
                            if(reader.name() == "url")
                            {
                                QString url  = reader.readElementText();
                                listeUrl << url;
                                splitUrl(url);
                                reader.readNext();
                                while(reader.isStartElement()==false)
                                    reader.readNext();
                            }
                            if(reader.name() == "heure")
                            {
                                reader.readNext();
                                while(reader.isStartElement()==false)
                                    reader.readNext();
                            }
                            if(reader.name() == "nom")
                            {
                                reader.readNext();
                                while(reader.isEndElement() == false)
                                {
                                    reader.readNext();
                                }
                                 if(reader.name() != "unHisto")
                                        reader.readNext();
                            }
                        }
                        reader.readNext();
                    }
                }
            }
            reader.readNext();
        }
        file.close();
    Si quelqu'un à une idée .. ^^
    Merci d'avance

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ce qui est intéressant, c'est que dans ton premier code, ton histogramme fait partie de la balise date, mais pas dans ton exemple...
    Tu peux aussi passer par QXmlQuery.

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Points : 26
    Points
    26
    Par défaut
    Je ne vois pas ce que tu veux dire !
    unHisto n'a jamais fait partie de date ...
    c'est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <historique>
      <jour>
         <date> ...... </date>
         <unHisto>
             <url> ... </url>
             <nom> ... </nom>
             <heure> ... </heure>
         </unHisto>
      </jour>
    </historique>
    Je peux juste avoir plusieurs <unHisto> dans un jour. Et plusieurs <jour> dans mon fichier XML.

    QXmlQuery c'est plus performant ?

    Je voulais utiliser QXMLStreamReader mais je n'arrive pas à tout parcourir ...

  9. #9
    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
    Citation Envoyé par sofuzion Voir le message
    QXmlQuery c'est plus performant ?
    Vue ce que tu veut faire je dirai plus adapté
    regarde cette exemple
    http://qt.developpez.com/doc/4.5/xmlpatterns-recipes/

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par sofuzion Voir le message
    Bonjour,
    je souhaite parcourir mon fichier xml pour recueillir des informations.

    Mon fichier xml est 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <historique>
      <jour>
         <date> </date>
         <unHisto> 
             <url> </url>
             <nom> </nom>
             <heure> </heure>
         </unHisto>
         <unHisto> 
             <url> </url>
             <nom> </nom>
             <heure> </heure>
         </unHisto>
      </jour>
    <jour>
         <unHisto> 
             <url> </url>
             <nom> </nom>
             <heure> </heure>
         </unHisto>
    </jour>
    </historique>
    J'enregistre dans mon fichier xml l'historique des pages visitées par l'utilisateur.

    J'ai fais :
    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
     
     QDomDocument doc;
    QFile file("historique.xml");
    file.open(QIODevice::ReadOnly);
    doc.setContent(&file);
    file.close();
     
    QDomElement root = doc.documentElement();
     
    QDomElement child = root.firstChild().toElement();
     
        while(!child.isNull())
        {
            if (child.tagName() == "jour")
            {
                QDomElement grandChild = child.firstChild().toElement();
                while(!grandChild.isNull())
                {
                    if (grandChild.tagName() == "date")
                    {
                        QDomElement grandGrandChild = grandChild.firstChild().toElement();
                        while(!grandGrandChild.isNull())
                        {
                            if (grandGrandChild.tagName() == "unHisto")
                            {
                                QDomElement grandGrandGrandChild = grandGrandChild.firstChild().toElement();
                                while(!grandGrandGrandChild.isNull())
                                {
                                    if (grandGrandGrandChild.tagName() == "url")
                                    {
                                        listeUrl << grandGrandGrandChild.text();
                                        splitUrl(grandGrandGrandChild.text());
                                    }
                                    grandGrandGrandChild = grandGrandGrandChild.nextSibling().toElement();
                                }
     
                            }
                            grandGrandChild = grandGrandChild.nextSibling().toElement();
                        }
     
                    }
                    grandChild = grandChild.nextSibling().toElement();
                }
            }
        }

    En fait, je souhaite mettre le contenu de mes balises <url> dans ma liste.

    Ce parcours me parait un peu long parce que ça fait planter mon appli :p

    Si quelqu'un à une idée ^^

    Merci d'avance
    Citation Envoyé par sofuzion Voir le message
    Je ne vois pas ce que tu veux dire !
    unHisto n'a jamais fait partie de date ...
    c'est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <historique>
      <jour>
         <date> ...... </date>
         <unHisto>
             <url> ... </url>
             <nom> ... </nom>
             <heure> ... </heure>
         </unHisto>
      </jour>
    </historique>
    Je peux juste avoir plusieurs <unHisto> dans un jour. Et plusieurs <jour> dans mon fichier XML.

    QXmlQuery c'est plus performant ?

    Je voulais utiliser QXMLStreamReader mais je n'arrive pas à tout parcourir ...
    Si tu compares ton xml et ton premier code...

    QXmlQuery, ce n'est pas plus performant, ça a un objectif différent. A toi de voir si c'est plus adapté à ton besoin.

Discussions similaires

  1. Parcours fichier XML
    Par ClineB dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 23/12/2013, 18h06
  2. Problème parcours fichier xml.
    Par imen1986 dans le forum APIs
    Réponses: 9
    Dernier message: 17/05/2010, 01h34
  3. Parcours fichier xml
    Par oclone dans le forum C#
    Réponses: 3
    Dernier message: 13/05/2009, 11h08
  4. [XPATH] parcours fichier xml : performances
    Par loic72 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 25/02/2008, 16h01
  5. Parcours fichier xml
    Par Christophe Charron dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/05/2006, 20h37

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