DOM (Document Object Model) et SAX (Simple API for XML)

D├ęcembre 2016
XML permet de définir la structure du document uniquement, ce qui permet d'une part de pouvoir définir séparément la présentation de ce document, d'autre part d'être capable de récupérer les données présentes dans le document pour les utiliser.

Toutefois la récupération des données encapsulées dans le document nécessite un outil appelé analyseur syntaxique (en anglais parser), permettant de parcourir le document et d'en extraire les informations qu'il contient.

Qu'appelle-t-on un analyseur ?

L'analyseur syntaxique (généralement francisé en parseur) est un outil logiciel permettant de parcourir un document et d'en extraire des informations.
Dans le cas de XML (on parle alors de parseur XML), l'analyseur permet de créer une structure hiérarchique contenant les données contenues dans le document XML.

On distingue deux types de parseurs XML :

  • les parseurs validants (validating) permettant de vérifier qu'un document XML est conforme à sa DTD
  • les parseurs non validants (non-validating) se contentant de vérifier que le document XML est bien formé (c'est-à-dire respectant la syntaxe XML de base)

Les analyseurs XML sont également divisés selon l'approche qu'ils utilisent pour traiter le document. On distingue actuellement deux types d'approches :

  • Les API utilisant une approche hiérarchique : les analyseurs utilisant cette technique construisent une structure hiérarchique contenant des objets représentant les éléments du document, et dont les méthodes permettent d'accèder aux propriétés. La principale API utilisant cette approche est DOM (Document Object Model)
  • Les API basés sur un mode événementiel permettent de réagir à des événements (comme le début d'un élément, la fin d'un élément) et de renvoyer le résultat à l'application utilisant cette API. SAX (Simple API for XML est la principale interface utilisant l'aspect événementiel
Ainsi, on tend à associer l'approche hiérarchique avec DOM et l'approche événementielle avec SAX.

Introduction à DOM

DOM (Document Object Model, traduisez modèle objet de document) est une spécification du W3C (World Wide Web Consortium) définissant la structure d'un document sous forme d'une hiérarchie d'objets, afin de simplifier l'accès aux éléments constitutifs du document.

Plus exactement DOM est un langage normalisé d'interface (API, Application Programming Interface), indépendant de toute plateforme et de tout langage, permettant à une application de parcourir la structure du document et d'agir dynamiquement sur celui-ci. Ainsi Javascript et ECMAScript utilisent DOM pour naviguer au sein du document HTML, ce qui leur permet par exemple de pouvoir récupérer le contenu d'un formulaire, le modifier, ...

DOM se divise en deux spécifications :

  • La spécification DOM level 1 (DOM niveau 1) se séparant en deux catégories
    • Core DOM level 1: La spécification pour les documents en général (dont XML)
    • HTML DOM level 1: La spécification retenant uniquement les méthodes applicables à HTML
  • La spécificaion DOM level 2 ajoutant de nouvelles fonctionnalités comme la prise en compte des feuilles de style CSS dans la hiérarchie d'objets.

Introduction à SAX

SAX est une API basée sur un modèle événementiel, cela signifie que SAX permet de déclencher des événements au cours de l'analyse du document XML.
Une application utilisant SAX implémente généralement des gestionnaires d'événements, lui permettant d'effectuer des opérations selon le type d'élément rencontré.

Soit le document XML suivant :

<personne>
<nom>Pillou</nom>
<prenom>Jean-François</prenom>
</personne>
Une interface événementielle telle que l'API SAX permet de créer des événements à partir de la lecture du document ci-dessus. Les événements générés seront :
start document
start element: personne
start element: nom
characters: Pillou
end element: nom
start element: prenom
characters: Jean-François
end element: prenom
end element: personne
end document
Ainsi, une application basée sur SAX peut gérer uniquement les éléments dont elle a besoin sans avoir à construire en mémoire une structure contenant l'intégralité du document.

L'API SAX définit les quatre interfaces suivantes :

  • DocumentHandler possèdant des méthodes renvoyant des événements relatifs au document :
    • startDocument() renvoyant un événement lié à l'ouverture du document
    • startElement() renvoyant un événement lié à la rencontre d'un nouvel élément
    • characters() renvoyant les caractères rencontrés
    • endElement() renvoyant un événement lié à la fin d'un élément
    • endDocument() renvoyant un événement lié à la fermeture du document
  • ErrorHandler possèdant des méthodes renvoyant des événements relatifs aux erreurs ou aux avertissements
  • DTDHandler renvoie des événements relatifs à la lecture de la DTD du document XML
  • EntityResolver permet de renvoyer une URL lorsqu'une URI est rencontrée

Comparaisons de DOM et de SAX

Les analyseurs utilisant l'interface DOM souffrent du fait que cette API impose de construire un arbre en mémoire contenant l'intégralité des éléments du document en mémoire quelle que soit l'application. Ainsi pour de gros documents (dont la taille est proche de la quantité de mémoire présente sur la machine) DOM devient insuffisant. De plus, cela rend l'utilisation de DOM lente, c'est la raison pour laquelle la norme DOM est généralement peu respectée car chaque éditeur l'implémente selon ses besoins, ce qui provoque l'apparition de nombreux parseurs utilisant des interfaces propriétaires...

Ainsi de plus en plus d'applications se tournent vers des API événementielles telles que SAX, permettant de traiter uniquement ce qui est nécessaire.


A voir également :

Ce document intitulé «  DOM (Document Object Model) et SAX (Simple API for XML)  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.