
|
auteur : François Jaffré |
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 methode readNext() et vérifier sur quel type de token
on est positionné.
Exemple avec le fichier XML | < developpez >
< contributeur > Superjaja< / contributeur >
< / developpez >
|
Si l'on parcourt le fichier avec la méthode readNext() les différents 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.
Voici un exemple un peu plus complexe
Fichier XML | <? 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 | QXmlStreamReader reader;
QString fileName = " developpez.xml " ;
QFile file (fileName);
file. open (QFile: : ReadOnly | QFile: : Text);
reader. setDevice (& file);
reader. readNext ();
while (! reader. atEnd ())
{
if (reader. isStartElement ())
{
if (reader. name () = = " root " )
{
reader. readNext ();
while (reader. isStartElement ()= = false )
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 ();
}
file. close ();
|
|
|
auteur : François Jaffré |
Qt depuis sa version 4.3 fourni la classe QXmlStreamWriter pour écrire des fichiers XML. Celle-ci est relativement simple et fonctionne sur le même principe que QXmlStreamReader pour la lecture.
On souhaite écrire le fichier XML suivant :
Fichier XML | <? xml version="1.0" encoding="UTF-8"? >
< root >
< site >
< nom > developpez< / nom >
< url > www.developpez.com< / url >
< / site >
< contributeur >
< nom faq = " c++ " > AAA< / nom >
< / contributeur >
< contributeur >
< nom faq = " Qt " > BBB< / nom >
< / contributeur >
< / root >
|
avec
Réalisation avec QXmlStreamWriter | QString fileName = " developpez.xml " ;
QFile file (fileName);
file. open (QFile: : WriteOnly | QFile: : Text);
QXmlStreamWriter writer (& file);
writer. setAutoFormatting (true );
writer. writeStartDocument ();
writer. writeStartElement (" root " );
writer. writeStartElement (" site " );
writer. writeTextElement (" nom " , " developpez " );
writer. writeTextElement (" url " , " www.developpez.com " );
writer. writeEndElement ();
writer. writeStartElement (" contributeur " );
writer. writeStartElement (" nom " );
writer. writeAttribute (" faq " , " c++ " );
writer. writeCharacters (" AAA " );
writer. writeEndElement ();
writer. writeEndElement ();
writer. writeStartElement (" contributeur " );
writer. writeStartElement (" nom " );
writer. writeAttribute (" faq " , " Qt " );
writer. writeCharacters (" BBB " );
writer. writeEndElement ();
writer. writeEndElement ();
writer. writeEndDocument ();
file. close ();
|
|
|
auteur : François Jaffré |
Qt permet de lire facilement un fichier XML avec l'API DOM. DOM permet de naviguer
dans un document XML comme dans un arbre avec toujours une relation parent enfant
entre les noeuds qui composent l'arbre.
La classe de base permettant de gérer les document avec DOM sous Qt est QDomDocument
et sa documentation se trouve
ici
Exemple de parcours d'un fichier XML simple :
fichier xml | <? xml version="1.0" encoding="UTF-8"? >
< root >
< site >
< nom > developpez< / nom >
< url > www.developpez.com< / url >
< / site >
< contributeur >
< nom faq = " c++ " > AAA< / nom >
< / contributeur >
< contributeur >
< nom faq = " Qt " > BBB< / nom >
< / contributeur >
< / root >
|
Parcours du fichier en utilisant l'API DOM | QString fileName = " developpez.xml " ;
QFile file (fileName);
file. open (QFile: : ReadOnly | QFile: : Text);
QDomDocument doc;
doc. setContent (& file, false );
QDomElement racine = doc. documentElement ();
racine = racine. firstChildElement ();
while (! racine. isNull ())
{
if (racine. tagName () = = " site " )
{
QDomElement unElement = racine. firstChildElement ();
while (! unElement. isNull ())
{
if (unElement. tagName () = = " nom " )
{
QString strNom = unElement. text ();
}
else if (unElement. tagName () = = " url " )
{
QString strURL = unElement. text ();
}
unElement = unElement. nextSiblingElement ();
}
}
if (racine. tagName () = = " contributeur " )
{
QDomElement elem = racine. firstChildElement ();
QString strNameContrib = elem. text ();
QString attFaq = elem. attribute (" faq " );
}
racine = racine. nextSiblingElement ();
}
|
|
|
auteur : François Jaffré |
Qt fourni la classe QDomDocument qui permet de gérer les fichiers XML à la manière de
DOM c'est à dire que le fichier XML est représenté par un arbre dans lequel on peut
se déplacer grâce à une relation de parent enfant entre les noeuds qui composent l'arbre.
Avec QDomDocument vous pouvez soit créer un fichier XML en partant de rien mais
vous pouvez aussi éditer un fichier existant (ajout de noeuds, modification de texte...).
Exemple dont le but est de créer le fichier XML ci-dessous à l'aide de l'API DOM de Qt :
fichier xml |
<? xml version="1.0" encoding="UTF-8"? >
< root >
< site >
< nom > developpez< / nom >
< url > www.developpez.com< / url >
< / site >
< contributeur >
< nom faq = " c++ " > AAA< / nom >
< / contributeur >
< contributeur >
< nom faq = " Qt " > BBB< / nom >
< / contributeur >
< / root >
|
écriture avec DOM | 
QDomDocument doc;
QDomNode xmlNode = doc. createProcessingInstruction (" xml " , " version=\"1.0\" encoding=\"UTF-8\" " );
doc. insertBefore (xmlNode, doc. firstChild ());
QDomElement root = doc. createElement (" root " );
doc. appendChild (root);
QDomElement site = doc. createElement (" site " );
root. appendChild (site);
QDomElement nom = doc. createElement (" nom " );
site. appendChild (nom);
QDomText nomText = doc. createTextNode (" developpez " );
nom. appendChild (nomText);
QDomElement url = doc. createElement (" url " );
site. appendChild (url);
QDomText urlText = doc. createTextNode (" www.developpez.com " );
url. appendChild (urlText);
QDomElement contributeur1 = doc. createElement (" contributeur " );
QDomElement nomContrib1 = doc. createElement (" nom " );
nomContrib1. setAttribute ( " faq " , " C++ " );
root. appendChild (contributeur1);
contributeur1. appendChild (nomContrib1);
QDomText nameContrib1 = doc. createTextNode (" AAA " );
nomContrib1. appendChild (nameContrib1);
QDomElement contributeur2 = doc. createElement (" contributeur " );
QDomElement nomContrib2 = doc. createElement (" nom " );
nomContrib2. setAttribute (" faq " , " Qt " );
root. appendChild (contributeur2);
contributeur2. appendChild (nomContrib2);
QDomText nameContrib2 = doc. createTextNode (" BBB " );
nomContrib2. appendChild (nameContrib2);
QFile file ( " developpez.xml " );
file. open (QIODevice: : WriteOnly);
QTextStream ts (& file);
int indent = 2 ;
doc. save (ts, indent);
|
|
Consultez les autres F.A.Q's


Les sources présentées sur cette page sont libres de droits
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur.
Copyright © 2006 Developpez Developpez LLC.
Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne
peut être faite de ce site ni de l'ensemble de son contenu : textes, documents
et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez
selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.