Intro :
Parfois dans un programme ou un jeu vidéo, il est nécessaire de charger des données sous format XML. Par exemple pour un éditeur de scène / monde, on peut vouloir charger les positions des entités directement depuis un fichier Scene.xml par exemple.
Prérequis :
– Savoir lire du C++
– Savoir lire un fichier XML
– Savoir importer des fichiers sources dans Visual C++
Explications :
TinyXML est une toute petite librairie C++ permettant de charger et d’analyser les données stockées dans un fichier XML. Elle est sous la licence Zlib (cela signifie que vous pouvez l’utiliser pour n’importe quoi !)
D’abord il vous faut télécharger les sources de TinyXML. La dernière version à la date d’écriture de cet article est la version 2.
Deux choix s’offrent à vous : soit d’utiliser la version 1 ; soit d’utiliser la version 2.
Les avantages de choisir la 2ème : meilleur gestion de la mémoire ; lecture plus rapide du fichier XML ; pas d’utilisation de la STL.
TinyXML charge complètement un fichier XML avec la méthode LoadFile()… Il vous reste ensuite le soin d’analyser votre fichier XML en fonction de son contenu en terme de nœuds.
On précise que XML est l’abréviation de « eXtensible Markup Language ». XML est un format pour stocker des données, pas un langage de programmation !
Celles-ci sont écrites entre des balises ou sous forme d’attributs, et l’ensemble est écrit sous forme d’un arbre.
Voici la structure d’un fichier XML :
<?xml version="1.0" ?> <root> <UnElement attribut1 ="une valeur" /> <UnAutreElement attribut2 = "2" attribute3 = "3"> <Element3 attribut4="4" /> Du Texte ! </UnAutreElement> </root>
Il vous faut importer dans votre projet Visual C++ la librairie directement par l’intermédiaire de ces fichiers :
– tinystr.cpp
– tinyxmlerror.cpp
– tinystr.h
– tinyxml.h
– tinyxml.cpp
– tinyxmlparser.cpp
Dans votre fichier source .cpp utilisant TinyXML, il vous faudra écrire #include « tinyxml.h » en tant que fichier d’en-tête !
Vous pouvez définir le define #define TIXML_USE_STL pour activer l’utilisation de la STL dans TinyXml.
Sachez que TinyXML reconnaît automatiquement l’encodage utilisé par le fichier à charger (il n’est pas nécessaire de renseigner l’attribut « encoding »).
Commençons l’analyse d’un fichier quelconque :
TiXmlDocument doc;
if(!doc.LoadFile("Test.xml"))
{
std::cerr << doc.ErrorDesc() << std::endl;
return FAILURE;
}
Le fichier « doc » contient toutes les données d’analyse du fichier XML chargé.
TiXmlElement* pRoot = doc.FirstChildElement();
if (pRoot == nullptr)
{
std::cerr << "Echec chargement du fichier. Aucun élément racine." << std::endl;
doc.Clear();
return FAILURE;
}
La méthode FirstChildElement() renvoie un pointeur vers un objet TinyXmlElement qui représente le premier nœud du fichier XML en question. FirstChildElement() prend un paramètre une chaîne de caractères représentant le nom du nœud en question.
Une boucle permet d’afficher tout les noms des éléments du fichier :
for (TiXmlElement* pElem = pRoot->FirstChildElement(); pElem != nullptr; pElem = pElem->NextSiblingElement())
{
std::string elemName = pElem->Value();
}
Le principe est le suivant : on parcourt chaque nœud en extrayant de chaque nœud enfant les attributs qui nous intéressent !
...
[...La boucle...]
const char* attr = nullptr;
if (elemName == "UnElement")
{
attr = elem->Attribute("attribut1");
if (attr != nullptr)
{
// Faire le travail d'analyse ici
}
}
[...Fin de boucle...]
La variable attr représente la valeur de l’attribut en question. Si l’attribut ne comporte pas le nom spécifié. La méthode Attribute(…) renvoie nullptr.
On peut tester si le contenu d’un nœud est du texte avec la méthode elem->ToText(). Elle renvoie nullptr s’il n’y a pas de texte.
Il peut être utile d’utiliser une structure de données spécifique customisée afin de stocker les données lues depuis le fichier XML. Mais cela reste facultatif !
On fini l’analyse avec l’appel de Clear() : doc.Clear();
Pour faciliter le parcours des nœuds, on peut utiliser ce qu’on appelle des handles.
Exemple :
TiXmlHandle hdl(&doc); TiXmlElement *elem = hdl.FirstChildElement().FirstChildElement().Element();
La méthode QueryIntAttribute(…) permet d’obtenir la valeur d’un attribut sous forme de integer
Voici la liste des classes de TinyXML formatée par Doxygen : http://www.grinninglizard.com/tinyxmldocs/annotated.html
Résumé :
Simple et efficace, la petite librairie TinyXML facilitera vos chargement de données sous format XML.
Références :
– http://www.dinomage.com/2012/01/tutorial-using-tinyxml-part-1/

