Pour lire un document XML, il existe deux méthodes assez répandues, Sax et DOM. Ces deux méthodes sont différentes, et si certains se plaisent à dire qu'elles sont complémentaires, je préfère dire que l'une est adaptée à certains types de problèmes et l'autre à d'autres.
Sax dispose d'un système de callbacks. Le principe est de lire balises après balises, et suivant le type de balise, le parser vous rend la main via un callback pour vous laisser agir comme bon vous semble. Cette méthode vous donne un grand contrôle sur la lecture du document XML et pour son interprétation. Ainsi, un tel parser ne prend pas beaucoup de place en mémoire contrairement à un parser basé sur DOM puisqu'à peu de choses près, la mémoire n'est allouée que par vous en fonction de vos besoins.
Un parser Sax est donc très intéressant pour lire des documents XML volumineux afin d'en extraire la partie intéressante, telle que le résultat d'une recherche. Il est aussi pratique lorsque toutes les données doivent être analysées mais n'ont pas besoin d'être en mémoire en même temps, comme pour effectuer des calculs ou réaliser des statistiques sur le contenu du document.
L'idée de DOM est très différente de celle de Sax. En effet, le parser va construire un arbre en mémoire représentant le document XML. Toutes les opérations suivantes auront donc lieu sur la représentation en mémoire. Il y a au moins deux avantages à un tel principe: d'une part l'accès aux données est rapide, bien plus rapide qu'avec la méthode Sax étant donné que les données ont été organisées en mémoire pour être facilement accédées, alors qu'avec Sax, les données restent dans le document XML, au format XML. D'autre part, les données, puisque chargées en mémoire, peuvent être relues plusieurs fois rapidement puisque le chargement est initial et n'a pas besoin d'être refait à chaque fois. DOM est donc optimal pour un document qui peut être chargé en mémoire intégralement, et sur lequel le but est d'effectuer de nombreux accès dessus.
Il existe plusieurs bibliothèques utilisables en C pour traiter des documents XML. Les plus connues sont peut-être libxml2 et expat. Expat est utilisée dans de grands projets comme Mozilla, et vous ne prenez pas de risques à ce qu'elle soit abandonnée un jour contrairement à de petits projets qui naissent avec la mode et meurent une fois la mode passée. De même, libxml2, comme son nom l'indique, The XML C library for GNOME, est utilisée dans le projet GNOME et dans de nombreux autres projets maintenant. Contrairement à ce que son nom pourrait laisser croire, elle est par contre utilisable de manière complètement indépendante du projet GNOME: vous avez nul besoin d'avoir installé GNOME, pas même glib, pour utiliser libxml2. Par ailleurs, elle est maintenue par Daniel Veillard, grand acteur français du monde XML, que je salue bien bas pour ses réalisations.
Libxml2 implémente DOM, et comme parler sérieusement à la fois de libxml2, d'expat, de Sax et DOM, dans un seul article, est tout à fait impossible, je limiterai le sujet à l'utilisation de la méthode DOM avec libxml2, en réservant Sax et/ou expat pour d'autres briques en C futures.
© 2003 Yves Mettier