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.
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.
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.
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
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.
|