Programmation Qt/Sauvegarder des données avec XML


Pour communiquer avec les fichiers XML, il faut d'abord importer le nouveau module du nom de QtXml. Ajoutez la ligne #include <QtXml> à chaque début de fichier qui communique avec l'XML. Dans le fichier .pro, ajoutez la ligne QT += xml. Sous Windows, il faudra mettre les fichiers DLL QtXmld4.dll et QtXml4.dll.

Utilisation du module QtXmlModifier

Création du fichierModifier

Pour plus de détails voir : Programmation XML.

Bien évidemment, il faut créer le fichier. Par exemple, un fichier wikimediaprojects.xml :

<?xml version="1.0" encodage="UTF-8" ?>
<wikimedia>
    <project>Wikipedia</project>
    <project>Wikibooks</project>
    <project>Wikimedia Commons</project>
</wikimedia>

Ce n'est qu'un exemple.

Chargement du fichierModifier

Pour charger le fichier, on utilise deux classes : QDomDocument et QFile. Voici maintenant la méthode :

QDomDocument *dom = new QDomDocument("xml");
QFile xml_doc("wikimediaprojects.xml");
if(!xml_doc.open(QIODevice::ReadOnly)) /* On teste l'ouverture du fichier */
{
	QMessageBox::warning(this,"Erreur à l'ouverture du document XML","Le document XML n'a pas pu être ouvert.");
}
if (!dom->setContent(&xml_doc)) /* On teste l'attribution du fichier, c'est-à-dire qu'on met le document XML dans l'objet QDomDocument */
{
	xml_doc.close();
	QMessageBox::warning(this, "Erreur à l'ouverture du document XML", "Le document XML n'a pas pu être attribué à l'objet QDomDocument.");
}

xml_doc.close(); /* Maintenant, on peut fermer le fichier car tout est dans le QDomDocument */

Lecture du fichierModifier

Maintenant, il faut récupérer ce qu'il y a dedans. Nous allons voir plusieurs méthodes pour récupérer des informations.

text()Modifier

La première méthode est la méthode text(). On l'utilise comme ceci :

/* Code précédent à introduire */

QDomElement elementWikimedia = dom.documentElement();
QDomNode noeudProject = elementWikimedia.firstChild();

QListWidget *listeProjects = new QListWidget();

while(!noeudProject.isNull()) /* Tant qu'on trouve des projets */
{
    elementProject = noeudProject.toElement; /* Transformation du noeud en élément */
    if(!elementProject.isNull())
    {
    	QListWidgetItem *itemProject = new QListWidgetItem(elementProject.text()); /* On met le texte de l'élément dans l'item de la liste */
    	listeProjects->addItem(itemProject); /* Et on place l'item dans la liste */
    	noeudProject = noeudProject.nextSibling();
    }
}

attribute()Modifier

Imaginons maintenant que vous avez un fichier comme ceci :

<?xml version="1.0" encoding="UTF-8" ?>
<wikimedia>
    <project lang="en">Wikibooks</project>
    <project lang="fr">Wikilivres</project>
</wikimedia>

Si on souhaite préciser la langue, on pourra par exemple mettre ceci :

QListWidgetItem *itemProject = new QListWidgetItem(QString(elementProject.text() + " (" + elementProject.attribute("lang", "?") + ")")); /* Cette fois-ci, on précise la langue entre parenthèses en combinant les QString */
listeProjects->addItem(itemProject);

Écriture dans le fichierModifier

Pour écrire dans le fichier, il faudra créer les éléments puis les introduire dans le fichier, que ce soit tous d'un coup ou un par un (la meilleure méthode est la première). Le principe est simple : on récupère l'ensemble du fichier, on le modifie, et enfin on remplace tout le fichier par le nouveau contenu.

BilanModifier

Maintenant que vous avez appris à vous servir de l'XML, cela sera très intéressant. Il permettra d'enregistrer diverses informations, par exemple des scores pour un jeu vidéo, ou encore des marques-pages pour un navigateur web. Tiens, mais quel est sera le prochain TP ? C'est la réalisation d'un navigateur web ! Mais avant ça, faisons un détour vers un autre moyen de sauvegarde, le SQL, dans le prochain chapitre →.