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:
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 :
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++ :
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(); |
Partager