09 mai
2007
Dans le cadre du projet client/serveur que j'ai déjà présenté, j'avais décidé que le serveur en C++/CLI et le client DS dialogueraient en XML.
Avec le framework .Net, c'est une chose très aisée avec le namespace xml. Pour la DS, rien de prévu en natif (et c'est normal
)
Si vous regardez le code de chaoui, vous pourrez constater que pour le client DS, j'ai fait un parsing à la bourrin à coup de substr et de find (note pour masterdjé : équivalent de mid$ en C++
).
Et bien aujourd'hui, je vais vous montrer dans ce billet comment utiliser la bibliothèque tinyxml dans un projet DS et avoir une facon de traiter le xml plus sure, plus propre et plus évolutive.
J'ai choisi tinyXml car c'est un projet open source très léger et assez simple d'utilisation. Vous pouvez télécharger les fichiers nécessaire à cette adresse sur sourceforge : sourceforge.net/project/showfiles.php , ou tout simplement récuperer les fichiers dans le projet exemple que je fournirai à la fin du billet.
On a besoin des fichiers :
- tinystr.cpp & tinystr.h
- tinyxml.cpp & tinyxml.h
- tinyxmlerror.cpp
- tinyxmlparser.cpp
Pour les inclure à son projet DS, il suffit de les copier dans le répertoire source et d'inclure dans son main.cpp :
#include "tinyxml.h"
Comme le besoin est de traiter du xml à la volée, j'ai décidé de me concentrer sur la lecture et création en mémoire. Je n'utiliserai donc pas de fichier .xml, ce qui m'évitera de trafiquer les fat et autres, où je ne connais absolument rien.
Ce que je propose, c'est de parser pour l'exemple la chaine suivante :
<rtl date="01/02/2007">Hello world</rtl>
On va récuperer la balise, un attribut et la valeur.
Voici le code :
TiXmlDocument *doc = new TiXmlDocument();
doc->Parse(xml.c_str());
TiXmlHandle hdl(doc);
TiXmlElement *elem = hdl.FirstChildElement().Element();
if (elem)
{
PA_OutputText(1, 2, 1, "balise : %s", elem->Value());
PA_OutputText(1, 2, 5, "attribut date : %s", elem->Attribute("date"));
PA_OutputText(1, 2, 9, "valeur : %s", elem->GetText());
}
On charge la chaine à parser avec Parse dans l'objet TiXmlDocument.
Puis pour le noeud qui nous intéresse, on utilise Value() pour récuperer le nom de la balise.
On accède aux attributs par la fonction Attribute et le nom de l'attribut. (notez qu'il pourrait être judicieux de tester la présence de cet attribut ou d'énumérer tous les attributs, mais dans mon cas, je sais que cet attribut sera fourni).
Et pour avoir la valeur du message dans la balise, on utilise GetText.
L'exemple produit en sortie, non sans humour :
balise : rtl
attribut date : 01/02/2007
valeur : Hello world
Vous pouvez télécharger l'exemple complet : xml.rar
<message auteur="nico">a+ Bonne prog</message>
DSDS DEVDEV XMLXML

09/05/2007 à 07:44:46 Dernière modif. : 09/05/2007 à 07:51:33