IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Le contenu de Qt4 > QtXml
        Comment lire un fichier XML avec QXmlStreamReader ?
        Comment écrire un fichier XML avec QXmlStreamWriter ?
        Comment lire un fichier XML avec DOM ?
        Comment écrire un fichier XML avec DOM ?



Comment lire un fichier XML avec QXmlStreamReader ?
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;//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
            //Tant que celui-ci n'est pas un element de depart on avance au token suivant.
            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();//On va au prochain Token
}
file.close();

Comment écrire un fichier XML avec QXmlStreamWriter ?
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);
//Ouverture du fichier en écriture et en texte.
file.open(QFile::WriteOnly | QFile::Text);
QXmlStreamWriter writer(&file);

//Permet l'indentation du fichier XML
writer.setAutoFormatting(true);

//Ecrit l'entête du fichier XML <?xml version="1.0" encoding="UTF-8" ?> 
writer.writeStartDocument();

//Élément racine du fichier XML
writer.writeStartElement("root");

//Ajoute l'élément site
writer.writeStartElement("site");

//Ajoute l'élément nom et lui applique le texte "developpez" et ferme l'élément nom
writer.writeTextElement("nom", "developpez");

//Ajoute l'élément url et lui applique le texte "www.developpez.com" et ferme l'élément url
writer.writeTextElement("url", "www.developpez.com");

//Ferme l'élément site
writer.writeEndElement();

//Ajoute l'élément contributeur
writer.writeStartElement("contributeur");

//Ajoute l'élément nom
writer.writeStartElement("nom");

//Ajoute un attribut a l'élément nom
writer.writeAttribute("faq", "c++");

//Ajout du texte à l'élément nom
writer.writeCharacters("AAA");

//Ferme l'élément nom
writer.writeEndElement();

//Ferme l'élément contributeur
writer.writeEndElement();
 
//Ajoute l'élément contributeur
writer.writeStartElement("contributeur");

//Ajoute l'élément nom
writer.writeStartElement("nom");

//Ajoute un attribut à l'élément nom
writer.writeAttribute("faq", "Qt");
writer.writeCharacters("BBB");

//Ferme l'élément nom
writer.writeEndElement();
//Ferme l'élément contributeur
writer.writeEndElement();
 
//Finalise le document XML
writer.writeEndDocument();

//Fermer le fichier pour bien enregistrer le document et ferme l'élément root
file.close();

Comment lire un fichier XML avec DOM ?
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);
//Ouverture du fichier en lecture seul et en mode texte
file.open(QFile::ReadOnly | QFile::Text);
 
QDomDocument doc;
//Ajoute le contenu du fichier XML dans un QDomDocument et dit au QDomDocument de ne pas tenir coompte des namspaces
doc.setContent(&file, false);
 
//ici racine pointe sur l'element <root> de notre document
QDomElement racine = doc.documentElement();

//ici racine pointe sur une fils de <root> c'est à dire <site>
racine = racine.firstChildElement();

//Boucle permettant la navigation dans le fichier XML
while(!racine.isNull())
{
    //Si on pointe sur un element de type <site>
    if(racine.tagName() == "site")
    {
        //On recupere le première enfant de l'element site c'est a dire <nom> ou <url>
        QDomElement unElement = racine.firstChildElement();
        
        //On parcours tous les enfants de l'element <site>
        while(!unElement.isNull())
        {
            //Si l'enfant de l'element site est l'element <nom>
            if(unElement.tagName() == "nom")
            {
                //On recupère le text contenu entre les balise <nom> </nom>
                QString strNom = unElement.text();
            }
            //Si l'enfant de l'element <site> est <url>
            else if(unElement.tagName() == "url") 
            {
                //On recupère le text contenu entre les balise <url> </url>
                QString strURL = unElement.text();
            }
            //Permet d'aller au prochaine enfant de <site> et de poursuivre la boucle
            unElement = unElement.nextSiblingElement();
        }
    }
     
    //ici racine pointe sur un element <contributeur>
    if(racine.tagName() == "contributeur")
    {
        //On pointe sur l'element <nom>
        QDomElement elem = racine.firstChildElement();
        
        //On recupere le texte de l'element <nom>
        QString strNameContrib = elem.text();
        
        //Recuperation de l'attribut faq de l'elment <nom>
        QString attFaq = elem.attribute("faq");
    }
 
    //On va a l'element fils de <root> suivant 
    racine = racine.nextSiblingElement();
}

Comment écrire un fichier XML avec DOM ?
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

//Objet de base servant à la création de notre fichier XML
QDomDocument doc;
 
//creation de l'entête du fichier XML <?xml version="1.0" encoding="UTF-8"?>
QDomNode xmlNode = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\""); 

//On insert cette entête avant le première enfant
doc.insertBefore(xmlNode, doc.firstChild());
 
 //Création de l'element <root>
QDomElement root = doc.createElement("root");

//On ajoute l'element <root> en tant que première enfant de notre document
doc.appendChild(root);

//Création de l'element <site>
QDomElement site = doc.createElement("site");

//On ajoute l'element <site> en tant que première enfant de l'element <root>
root.appendChild(site);

//création de l'element <nom>
QDomElement nom = doc.createElement("nom");

//On ajoute l'element <nom> en tant que première enfant de l'element <site>
site.appendChild(nom);
 
 //Creation du texte qui sera entre les balises <nom> </nom>
QDomText nomText = doc.createTextNode("developpez");

//On ajoute ce texte à l'element <nom>
nom.appendChild(nomText);
 
//Création de l'element <url>
QDomElement url = doc.createElement("url");

//On ajoute l'element <url> en tant que deuxième enfant de l'element <site>
site.appendChild(url);

//Creation du texte qui sera entre les balises <url> </url> 
QDomText urlText = doc.createTextNode("www.developpez.com");

//On ajoute ce texte à l'element <url>
url.appendChild(urlText);

//Création de l'element <contributeur>
QDomElement contributeur1 = doc.createElement("contributeur");

//Création de l'element <nom>
QDomElement nomContrib1 = doc.createElement("nom");

//Ajout de l'attibut "faq" qui aura la valeur "C++" à l'element <nom>
nomContrib1.setAttribute( "faq","C++");

//On ajoute l'element <contributeur> en tant qu'enfant de l'element <root>
root.appendChild(contributeur1);

//On ajoute l'elemnt <nom> en tant qu'enfant de l'element <contributeur>
contributeur1.appendChild(nomContrib1);

//Creation du texte qui sera entre les balises <nom> </nom>
QDomText nameContrib1 = doc.createTextNode("AAA");

//On ajoute ce texte à l'element <nom>
nomContrib1.appendChild(nameContrib1);
 
//Création de l'element <contributeur>
QDomElement contributeur2 = doc.createElement("contributeur");

//Création de l'element <nom>
QDomElement nomContrib2 = doc.createElement("nom");

//Ajout de l'attibut "faq" qui aura la value "Qt" à l'element <nom>
nomContrib2.setAttribute("faq","Qt");

//On ajoute l'element <contributeur> en tant qu'enfant de l'element <root>
root.appendChild(contributeur2);

//On ajoute l'elemnt <nom> en tant qu'enfant de l'element <contributeur>
contributeur2.appendChild(nomContrib2);

//Creation du texte qui sera entre les balises <nom> </nom>
QDomText nameContrib2 = doc.createTextNode("BBB");

//On ajoute ce texte à l'element <nom>
nomContrib2.appendChild(nameContrib2);
 
//Creation du fichier XML de sortie
QFile file( "developpez.xml" );

//Ouverture de ce fichier en lecture seule
file.open(QIODevice::WriteOnly);
 
//On crée une QTextStream a partir de ce fichier
QTextStream ts(&file);

//Valeur servant au nombre de caractere pour l'indentation du fichier XML
int indent = 2;

//On sauvegarde le fichier XML en precisant l'indentation desirée
doc.save(ts, indent);


Consultez les autres F.A.Q's


Valid XHTML 1.1!Valid CSS!

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.