Introduction à Java XML
Aperçu du traitement XML en Java — approches DOM, SAX, StAX et JAXB, avec exemples de code JDK.
XML (Extensible Markup Language) est un format texte pour représenter des données structurées et hiérarchiques à l'aide de balises imbriquées. Bien avant que JSON ne domine les API web, XML était le standard pour les fichiers de configuration, les formats de documents et les échanges de messages — et il est encore omniprésent, des fichiers Maven pom.xml aux services SOAP en passant par les documents Office.
Java dispose d'un support XML riche et natif dans le JDK : vous n'avez besoin d'aucune bibliothèque externe pour lire ou écrire du XML. Les packages javax.xml.parsers et org.w3c.dom, ainsi que org.xml.sax et javax.xml.stream, vous offrent trois modèles d'analyse distincts. Ce chapitre présente ce qu'est XML, quel modèle d'analyse choisir, et comment XML se compare à JSON — afin que le reste de cette partie (DOM, SAX et JAXB) repose sur des bases solides.
Cette page couvre :
- À quoi ressemble un document XML et les termes essentiels (élément, attribut, racine, bien formé).
- Les trois modèles d'analyse JDK — DOM, SAX et StAX — et quand chacun est approprié.
- Un exemple DOM exécutable utilisant uniquement les classes JDK.
- Les différences entre XML et JSON, pour savoir lequel choisir.
À quoi ressemble XML
Un document XML est un arbre d'éléments. Chaque élément possède un nom, des attributs optionnels, et soit du contenu textuel soit des éléments enfants imbriqués. Il y a toujours exactement un élément racine qui englobe tout.
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="1" lang="en">
<title>Effective Java</title>
<price>45.00</price>
</book>
</catalog>Ici <catalog> est la racine, <book> est un élément enfant avec deux attributs (id et lang), et <title> et <price> portent du texte. La déclaration XML en première ligne indique la version et l'encodage des caractères. Un XML bien formé exige que chaque balise ouvrante soit fermée et correctement imbriquée.
Les trois modèles d'analyse
Le JDK propose trois façons de lire du XML, chacune avec un compromis différent entre commodité et mémoire. Choisir le bon modèle est la décision XML la plus importante que vous aurez à prendre.
| Modèle | Style | Mémoire | Idéal pour |
|---|---|---|---|
| DOM | Charge l'arbre entier en mémoire | Élevée | Accès aléatoire, édition, documents petits/moyens |
| SAX | Pousse des événements lors de l'analyse (callbacks) | Faible | Grands documents, lecture seule en flux |
| StAX | Tire des événements à la demande (curseur) | Faible | Grands documents, avec un flux de contrôle plus simple |
DOM construit un arbre complet en mémoire que vous pouvez parcourir librement et modifier. SAX déclenche des callbacks (startElement, characters, endElement) lors de la lecture, sans jamais conserver l'intégralité du document. StAX est également en flux continu, mais laisse votre code tirer le prochain événement quand il est prêt, ce qui est généralement plus lisible que les callbacks SAX.
DOM : l'arbre en mémoire
DOM est le modèle le plus pratique lorsque les documents sont suffisamment petits pour tenir en mémoire. Vous analysez une fois, puis parcourez ou interrogez l'arbre autant que vous le souhaitez.
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document doc = factory.newDocumentBuilder().parse("catalog.xml");
NodeList books = doc.getElementsByTagName("book");
System.out.println("Books: " + books.getLength());getElementsByTagName retourne une NodeList vivante ; vous l'indexez et convertissez les nœuds en Element pour lire les attributs et le texte des enfants. Le chapitre dédié au parseur Java XML DOM explique en détail comment naviguer, modifier et écrire l'arbre.
By default the JDK parser resolves external entities, which exposes you to XXE (XML External Entity) attacks when parsing untrusted input. For production code that reads XML from outside your control, disable DTDs with factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); before creating the builder.
SAX et StAX : le flux continu
Lorsqu'un document est trop volumineux pour tenir en mémoire, vous le lisez en flux. SAX pousse des événements vers un handler que vous fournissez :
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
DefaultHandler handler = new DefaultHandler() {
public void startElement(String uri, String local, String name, Attributes a) {
System.out.println("Start: " + name);
}
};
SAXParserFactory.newInstance().newSAXParser()
.parse("catalog.xml", handler);StAX vous donne un curseur que vous faites avancer vous-même, ce que beaucoup trouvent plus clair :
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamConstants;
import java.io.FileReader;
XMLStreamReader r = XMLInputFactory.newInstance()
.createXMLStreamReader(new FileReader("catalog.xml"));
while (r.hasNext()) {
if (r.next() == XMLStreamConstants.START_ELEMENT) {
System.out.println("Start: " + r.getLocalName());
}
}Consultez le chapitre parseur Java XML SAX pour un parcours complet des handlers d'événements. Si vous préférez éviter l'analyse manuelle des nœuds et mapper directement XML sur des objets Java, JAXB lie les éléments à des classes annotées pour vous.
Un exemple autonome
L'exemple exécutable ci-dessous utilise uniquement des classes JDK — ni Jackson ni JAXB ne sont nécessaires. Il analyse un catalogue XML depuis une chaîne en mémoire avec DOM, parcourt les éléments <book>, lit les attributs et le texte des enfants, et calcule la somme des prix.
Ce qu'il faut retenir de l'exécution :
- L'analyse DOM ne nécessite aucune dépendance externe —
DocumentBuilderFactoryetorg.w3c.domsont fournis avec le JDK, c'est pourquoi le programme affiche des résultats sans rien sur le classpath. - Le nom de l'élément racine affiché en tant que
catalogconfirme qu'il y a exactement une racine englobant tout le document. getElementsByTagName("book")a retourné uneNodeListde longueur 2 ; vous l'indexez comme une liste et convertissez chaque élément enElement.- Les attributs (
id) sont lus avecgetAttribute, tandis que le contenu textuel (title,price) est lu avecgetTextContent— ce sont deux types de données différents sur le même élément. - Étant donné que l'arbre entier est en mémoire, calculer la somme des prix de tous les livres à
$83.50est simplement une boucle avec accès aléatoire — la commodité qui justifie le coût mémoire de DOM.
XML ou JSON ?
XML et JSON résolvent le même problème — l'échange de données structurées — mais font des compromis différents.
| Aspect | XML | JSON |
|---|---|---|
| Syntaxe | Balises verbeuses, ouvrantes et fermantes | Accolades et crochets compacts |
| Attributs | Oui (id="1") | Non — tout est une paire clé/valeur |
| Commentaires | Supportés (<!-- ... -->) | Non supportés |
| Schéma/validation | Mature (XSD, DTD) | JSON Schema, moins répandu |
| Support JDK | Intégré (javax.xml.*) | Aucun intégré — nécessite une bibliothèque |
| Utilisation typique aujourd'hui | Config, documents, SOAP, systèmes legacy | API web/REST, services modernes |
Choisissez XML lorsque vous devez consommer un format XML existant (un service SOAP, un pom.xml, un document Office) ou lorsque vous avez besoin d'attributs, de commentaires ou d'une validation de schéma stricte. Choisissez JSON pour les nouvelles API web, où sa taille réduite et son support natif dans les navigateurs l'emportent.
Prochaines étapes
- Parseur Java XML DOM — lire, modifier et écrire l'arbre.
- Parseur Java XML SAX — traiter en flux de grands documents avec des handlers d'événements.
- JAXB — mapper XML vers et depuis des objets Java annotés.
- Introduction Java JSON — l'alternative moderne pour les données web.