libxml++ est une librairie permettant de lire et ecrire facilement des document XML en C++.
Avant de commencer, quelques rappels sur les commandes qui pourront être utiles :
Et oui, autour de XML tournent tout un tas de buzzwords, que nous allons nous empresser de découvrir. Tout d'abord, si vous ne savez pas ce qu'est XML, je vous conseille vivement de faire un détour du coté des tutoriels de W3Schools qui en plus d'être abordables, sont assez complets. Pour ce qui est de SAX et DOM, ce sont deux interfaces qui définissent des moyens différents d'accéder aux données contenues dans un fichier XML. SAX permet de lire le fichier de manière séquentielle, traitant les balises une par une. L'avantage de cette méthode est de demander nettement moins de mémoire lorsque les documents deviennent un petit peu important. DOM permet de lire l'intégralité du fichier XML, et de le stocker en mémoire sous forme d'un arbre auquel on accède ensuite par le biais d'objet. Cette méthode est à mon avis beaucoup plus simple d'utilisation, car elle permet entre autres de traiter les données dans un ordre différent de celui dans lequel elles sont stockées.
libxml++ se base sur la libxml, qui elle même offre des interfaces SAX et DOM. Si vous désirez plus de détails sur les spécifications de ces deux interfaces, vous en trouverez sur la page du projet SAX pour SAX, et la page du W3C pour DOM.
Parser un document XML peut se faire très simplement à l'aide de l'objet xmlpp::DomParser. Voyons tout d'abord la portion de code suivant :
xmlpp::DomParser parser;
parser.set_validate();
parser.set_substitute_entities();
parser.parse_file(filepath);
if(parser)
{
xmlpp::Document* doc = parser.get_document();
xmlpp::Element* root = doc.get_root_node();
// Parcours l'arbre
}
D'abord on utilise la fonction set_validate qui, pour autant que je sache, ne fait pas valider le document par le parser, mais fait vérifier que le document soit bien formé. D'après les reccomendations du W3C, un programme ne devrait pas ouvrir et traiter un document XML qui ne soit pas bien formé. Notez que set_validate prend un booléen en argument qui vaut true par défaut.
On appelle ensuite set_substitute_entities qui permet de remplacer automatiquement les entitées par leurs vraies valeurs. Il est en effet possible de définir, dans un document, des entités qui sont des sortes d'alias pour certaines données (les entités commencent par & et finissent par ;). La fonction set_substitute_entities prend elle aussi un booléen valant true par défaut en argument.
Il ne reste alors plus qu'à appeler la fonction parse_file qui prend comme paramètre l'adresse du fichier à parser pour que la totalité du document soit parsée et mise en mémoire. On utilise alors la fonction get_document pour accéder au document en lui même, puis la fonction get_root_node pour accéder au noeud racine du document. On peut alors parcourir l'arbre à partir de ce noeud.