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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 très actif
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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
    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 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    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
    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.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  5. #5
    Membre averti
    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
    Par défaut
    Merci beaucoup
    Je vais regarder avec ça !
    Je vous tiens au courant

  6. #6
    Membre averti
    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
    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

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