Cours de DOM et SAX en PDF (Débutant)
Cours DOM et SAX : introduction aux concepts fondamentaux de la manipulation de documents XML via deux approches principales : le modèle objet DOM (Document Object Model) et l'API événementielle SAX (Simple API for XML). Le document présente principes, arborescence de nœuds, cas d'usage et exemples pratiques pour débutants.
Syntaxe XML et structure des documents
Règles essentielles : un document bien formé peut débuter par une déclaration de prologue (<?xml version="1.0" encoding="UTF-8"?>), utilise des balises ouvrantes et fermantes correctement imbriquées, distingue la casse et impose des guillemets pour les attributs. Il faut également échapper les caractères spéciaux et gérer les entités prédéfinies (&, <, >, ", '). Les espaces de nommage (namespaces) qualifient éléments et attributs issus de vocabulaires différents via préfixes et URI, ce qui évite les collisions. Respecter ces règles garantit un parsing fiable et facilite la validation par DTD ou XSD.
Objectifs d'apprentissage
- Introduction au format : bases du format, syntaxe et usages courants.
- DOM (Document Object Model) : navigation et manipulation d'un arbre de nœuds (Document, Element, Attr, Text), niveaux DOM (1–3) et opérations comme le clonage.
- SAX (Simple API for XML) : lecture séquentielle, handlers principaux et gestion événementielle pour le parsing et la transformation en flux.
- Éléments, attributs et namespaces : identification et utilisation correcte des espaces de nommage.
- Analyseurs et validation : différences entre analyseurs non-validants et validants (DTD/XSD) et impact sur le traitement.
- Gestion des erreurs : bonnes pratiques pour robustifier les parsers et reprendre l'exécution après incidents.
📑 Sommaire du document
Chapitres clés : navigation et clonage des nœuds, gestion des espaces blancs et du contenu textuel, filtres et pipelines SAX, configuration d'analyseurs validants (DTD/XSD) et exemples de mise en œuvre en Java avec JAXP.
Prérequis techniques
- Installation du JDK (Java Development Kit)
- Notions de base en Java
- Un éditeur de texte ou un IDE (Eclipse, IntelliJ IDEA, VS Code)
👤 À qui s'adresse ce cours ?
- Public cible : débutants souhaitant acquérir des compétences pratiques en manipulation de fichiers et flux XML.
- Prérequis : connaissance élémentaire de la structure de documents et notions de balisage recommandées.
- Niveau : Support de cours de niveau universitaire (Master/Ingénieur).
- Idéal pour : étudiants en informatique (Licence/Master) cherchant un complément pratique.
- Auteur : Philippe Poulard
Exemple de fichier XML pour le parsing
<bibliotheque>
<livre id="1">
<titre>Programmation XML</titre>
<auteur>Nom Auteur</auteur>
</livre>
</bibliotheque>
DOM vs SAX : Quelle méthode choisir ?
| Critère | DOM | SAX |
|---|---|---|
| Consommation mémoire | Élevée — charge l'ensemble du document en mémoire (arbre de nœuds). | Faible — traitement en streaming sans conservation complète du document. |
| Vitesse | Variable — peut ralentir pour très grands fichiers en raison de l'instanciation d'objets. | Rapide pour lecture linéaire ; adapté aux flux volumineux. |
| Facilité d'utilisation | Élevée — manipulation directe de l'arbre, utile pour modifications et clonage. | Plus technique — nécessite gestion d'événements et handlers, idéal pour pipelines et transformations en streaming. |
Dans le contexte SAX, les déclencheurs correspondent aux événements produits lors du parsing : début et fin de document, début et fin d'éléments, caractères rencontrés, etc. Ces événements permettent d'attacher des traitements ciblés — extraction de données, filtrage ou indexation — sans construire l'arbre complet, ce qui est utile pour l'extraction de métadonnées ou la conversion en flux. Les handlers associent chaque balise à une action spécifique lors du parsing.
Avantages et inconvénients de DOM vs SAX
Le modèle objet expose un arbre manipulable en mémoire, pratique pour modifications aléatoires et navigation. L'API événementielle émet des callbacks au fur et à mesure du parsing : les handlers reçoivent début/fin d'éléments et contenu, permettant un traitement en flux économe en ressources. Le choix dépend du besoin : édition complète du document (DOM) ou traitement linéaire et transformations en temps réel (SAX).
Les filtres et pipelines avec SAX
Les filtres interceptent les événements produits par le parser (début d'élément, caractères, fin d'élément) pour les modifier, enrichir ou filtrer avant transmission. Enchaîner plusieurs filtres crée un pipeline qui sépare responsabilités (validation légère, normalisation, transformation partielle) et facilite la construction de chaînes de traitement modulaires sans charger entièrement le document.
ContentHandler: réception des événements de contenu pendant le parsing.ErrorHandler: gestion des erreurs et warnings remontés par l'analyseur.EntityResolver: résolution personnalisée des entités externes et prévention des accès non désirés.
Cas pratique : parsing d'un fichier livre.xml
<livres>
<livre id="1">
<titre>XML pratique</titre>
<auteur>Dupont</auteur>
</livre>
</livres>
Lors du parsing SAX de ce fichier, un handler typique recevra la séquence d'événements suivante : startDocument, startElement pour livres, startElement pour livre, startElement pour titre, characters (contenu du titre), endElement pour titre, puis de même pour auteur, enfin endElement pour livre et endDocument. Chaque événement permet d'extraire et de traiter des fragments sans stocker l'arborescence complète.
Événements de parsing SAX (séquence)
startDocument— initialisation du parsing.startPrefixMapping(optionnel) — gestion des namespaces.startElement— arrivée d'un élément avec ses attributs.characters— contenu textuel rencontré à l'intérieur d'un élément.endElement— fin d'un élément donné.endPrefixMapping(optionnel) — fin de portée d'un namespace.processingInstructionetskippedEntity— événements complémentaires selon le document.endDocument— fin du parsing et libération des ressources.
Espaces de nommage (Namespaces) et analyseurs validants
Les namespaces distinguent éléments et attributs provenant de vocabulaires différents ; les APIs exposent des méthodes pour obtenir URI et préfixes. Les analyseurs validants vérifient la conformité structurelle du document selon une définition de schéma et signalent les incohérences au moment du parsing. Choisir un analyseur validant implique un compromis entre robustesse et coût en performance, à considérer selon la taille des fichiers et le niveau d'exigence.
Validation avec DTD et XSD
La validation structurelle s'effectue via DTD (Document Type Definition) ou XSD (XML Schema Definition). Un DTD définit la structure attendue (éléments autorisés, ordre, occurrences) ; un XSD offre des types de données et des contraintes plus fines. Lorsqu'un parseur DOM est construit à partir d'un document validé, l'arbre en mémoire reflète la structure imposée par le DTD : éléments présents, ordre et cardinalité correspondent à la définition. La configuration d'un analyseur validant permet de détecter les erreurs de schéma durant le parsing, ce qui réduit les défauts en aval mais peut rallonger le temps de traitement.
Implémentations et bibliothèques
Exemples d'outils courants pour le parsing : JAXP (API Java standard) fournit des implémentations pour DOM et SAX et sert d'interface pour intégrer divers moteurs. Xerces est une bibliothèque Java robuste supportant validation XSD et DTD. libxml2 est une bibliothèque C largement utilisée offrant parsing, validation et gestion des namespaces. Ces bibliothèques facilitent le parsing, la validation et l'intégration dans des architectures back-end ou des chaînes de traitement.
Programmation XML en Java avec JAXP
L'API JAXP standardise l'accès aux parseurs DOM et SAX en Java : fabrique de parseurs, configuration des features (validation, namespaces, protection contre les entités externes) et abstraction des implémentations sous-jacentes. JAXP permet d'interchanger des moteurs (par ex. Xerces) sans modifier le code métier.
// Exemple d'initialisation SAX avec JAXP
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true); // activer la validation si nécessaire
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setContentHandler(new MonContentHandler());
reader.parse(new InputSource(new FileInputStream("livres.xml")));
// API JAXP, parsing XML Java, callback SAX
Architecture de l'API JAXP pour DOM et SAX
JAXP expose des factories (DocumentBuilderFactory pour DOM, SAXParserFactory pour SAX) et des builders/parseurs. Cette architecture sépare l'interface du moteur, facilite la configuration et permet d'activer des options de sécurité (désactivation des entités externes, limites de taille) indépendamment de l'implémentation utilisée.
Différences de performance entre analyseurs validants
Les analyseurs validants réalisent des vérifications supplémentaires (résolution d'entités, vérification des types) ce qui augmente le coût CPU et mémoire. En lecture seule de très gros fichiers, un parseur non-validant en streaming reste la solution la plus efficace ; pour des flux critiques, la validation peut prévenir des erreurs coûteuses en production.
Cas d'usage concrets de SAX et DOM
Exemples pratiques :
- Fichiers de configuration serveur (ex.
web.xml) : DOM facilite l'édition et la génération de nouveaux éléments, tandis que SAX permet la lecture rapide et l'extraction de paramètres. - Échange de données B2B : parsing en streaming pour extraire et transformer en temps réel sans charger d'énormes documents en mémoire.
- Indexation et ETL : pipelines SAX comprenant des filtres pour normalisation, filtrage et enrichment avant insertion en base.
❓ Foire Aux Questions (FAQ)
Qu'est‑ce que le DOM et le SAX ?
Le DOM représente un document sous forme d'arbre de nœuds permettant lecture et modification. SAX est une API événementielle qui lit séquentiellement et déclenche des callbacks (ContentHandler, etc.) sans construire l'arbre complet, en s'appuyant sur des événements pour traiter le flux.