Ce que j’utilise pour parser du XML avec PHP

Jeudi 18 février

Si je dois juste lire le document (pas le modifier) et qu’il n’est pas trop long, j’utilise SimpleXML.

Pour les documents plus complexes ou qui doivent pouvoir être modifiés, j’utilise directement le DOM. C’est aussi fastidieux (voire davantage) que les manipulations de Document Object Model via JavaScript, mais c’est robuste et efficace.

Enfin, pour les documents qui sont vraiment volumineux (du genre fichiers XML de 80 Mo et comportant plus d’un million de lignes), là, pas le choix, il faut utiliser un parseur SAX.

Là où SimpleXML et le DOM chargent tout le document en mémoire RAM et construisent une arborescence complète, le parseur SAX traite le XML comme une longue chaîne de caractères, linéaire, plate. Il émet des évènements quand il rencontre une balise d’ouverture, une de fermeture ou du texte, et ces évènements appellent des fonctions de callback. Un tel parseur a besoin de bien peu de mémoire, et est donc très performant. Son inconvénient majeur, par contre, est d’être très bas niveau, et il impose de garder soi-même trace de l’évolution de la progression dans le document. Par exemple : « suis-je dans un élément enfant d’un élément X ? Pour le savoir, je vais vérifier une variable booléenne que je mets à true lorsque je rentre dans un tel élément, et à false quand j’en sors ».

Et comme un parseur SAX ne construit aucune arborescence de document, il est impossible d’obtenir une vision globale de celui-ci ainsi que de faire des sauts réguliers d’une partie à l’autre. C’est très rigide, austère, mais cet outil a le grand mérite d’exister. Et il n’y a pas d’alternative technique quand on vous refile des documents de plus d’un million de lignes.

Cela étant dit, ce n’est pas parce qu’un parseur SAX traite un document XML comme un immense serpent de texte que l’on doit forcément tout faire en une seule passe. Je me rappelle ainsi d’un projet où j’utilisais un premier parseur pour, dans un document, extraire des éléments qui définissaient des caractéristiques typographiques (taille de texte, graisse, italique ou non, etc.). Une fois ces infos obtenues, je les stockais dans une variable PHP puis lançais un second parseur sur mon document. Second parseur qui, lui, pouvait ainsi consulter les informations typographiques dont il avait besoin en parcourant le XML.