Il existe deux grandes façons de lire des documents XML et de les analyser dans du code Java (ou autre langage) : DOM et SAX.
DOM signifie
Document Object Model
. Il consiste à associer un graphe d’objets à un document XML, et à naviguer dedans en suivant les relations père-fils naturellement. Son principal avantage est la facilité avec laquelle on peut naviguer dans l’arbre XML. L’approche DOM semble la plus naturelle du point de vue de la programmation objet. L’inconvénient majeur de DOM est qu’il nécessite de charger l’intégralité du document XML en mémoire. Dès que les documents dépassent une certaines taille (quelques giga-octets tout de même…), DOM n’est plus utilisable. D’autre part, dans certains cas cette possibilité de navigation offerte par DOM n’est pas utile. Les traitements que DOM doit faire pour convertir un document XML en graphe d’objets deviennent alors superflus, ce qui est d’autant ennuyeux qu’ils peuvent être très lourds.
À l’opposé SAX,
Simple API for XML
, ne reconstruit pas d’arbre d’objets en mémoire. SAX analyse un document XML, et lorsqu’il rencontre des éléments ou des attributs particuliers, précisés par l’utilisateur, exécute certains traitements, invoqués sous forme de callbacks. On dit que SAX est un modèle piloté par événements. Ces événements sont simplement l’occurrence d’un élément, par exemple.
DOM est consommateur de ressources, et à mesure que le document augmente de taille, cette consommation augmente aussi. À l’opposé, SAX consomme une quantité de ressources à peu près constante, qui dépend essentiellement du nombre de callbacks que l’on pose sur l’analyse du document.
D’une façon générale, il faut réserver à DOM le traitement des documents peu importants, et lorsque les performances ne sont pas cruciales. Dans tous les autres cas, SAX sera la bonne API à choisir.
Ces deux API sont comme à l’habitude, des jeux d’interfaces. L’implémentation standard de ces interfaces, fournie par le JDK, est Xercès, développé et distribué en open-source par l’Apache Software Fondation. Cette API n’est probablement pas la meilleure : elle est complexe, lourde à utiliser, et peu performante. On pourra lui préférer Dom4J, bien qu'elle soit moins complète. C’est cette implémentation que nous allons présenter dans la suite.