La bibliothèque standard de Python fournit deux modules pour traiter du XML : xml.etree.ElementTree et xml.dom.minidom. Le package tiers lxml, lui, reprend l’API d’ElementTree en y ajoutant la validation XSD et un support XPath complet. Choisir entre ces trois options dépend de la taille du fichier XML, du besoin en validation de schéma et des contraintes de sécurité du projet.
Modèle d’arbre DOM contre API ElementTree : ce que chaque approche charge en mémoire
minidom implémente le standard W3C DOM Level 1. Chaque nœud du document XML devient un objet Python distinct (Element, Text, Comment, Attr). Pour un fichier modeste, cette représentation complète est pratique : on navigue via parentNode, childNodes, getAttribute().
Le coût se paie en mémoire. Chaque nœud texte, y compris les espaces entre balises, génère un objet. Sur un fichier de quelques mégaoctets, la consommation mémoire grimpe vite par rapport à ElementTree, qui ne crée pas d’objet pour les nœuds texte isolés.
ElementTree (module xml.etree.ElementTree) utilise un modèle plus léger. Un élément porte directement ses attributs dans un dictionnaire Python, son texte dans .text et le texte après sa balise fermante dans .tail. Il n’y a pas d’objet séparé pour chaque fragment textuel.
Conséquence directe : ElementTree consomme moins de mémoire que minidom sur le même document XML. Pour du parsing courant (fichiers de configuration, réponses d’API, sitemaps), c’est le module à privilégier par défaut.

XPath et validation XSD : là où lxml se distingue d’ElementTree
Le module standard ElementTree ne supporte qu’un sous-ensemble restreint de XPath. Les expressions comme .//element[@attr='value'] fonctionnent, mais les axes (preceding-sibling, ancestor) et les fonctions XPath avancées (contains(), substring()) ne sont pas disponibles.
lxml, qui s’appuie sur les bibliothèques C libxml2 et libxslt, expose la totalité de la spécification XPath 1.0. Pour extraire des données dans un document XML complexe avec des espaces de noms imbriqués, cette différence est décisive.
L’autre apport majeur de lxml concerne la validation. Un schéma XSD peut être chargé puis appliqué à un arbre parsé en quelques lignes :
- Charger le schéma avec
etree.XMLSchema(etree.parse('schema.xsd')) - Appeler
schema.validate(tree)pour obtenir un booléen - Consulter
schema.error_logpour identifier précisément les erreurs de conformité
Ni ElementTree ni minidom ne proposent de validation XSD intégrée. Si le projet impose de vérifier la conformité d’un fichier XML à un schéma, lxml est la seule option viable parmi ces trois bibliothèques.
Sécurité du parsing XML en Python : attaques XXE et choix de parseur
Le XML autorise les entités externes (XXE), qui permettent à un document XML de référencer des fichiers locaux ou des URL distantes. Un parseur mal configuré qui traite du XML provenant d’une source non fiable s’expose à des fuites de données ou à du déni de service.
Le module standard ElementTree désactive par défaut le chargement des entités externes depuis Python 3.8. C’est un avantage concret pour les projets qui traitent du XML reçu par API ou uploadé par des utilisateurs.
lxml, en revanche, a connu des vulnérabilités documentées liées au traitement des entités externes. Avant la version 4.9.1, certaines fonctions de parsing de métadonnées étaient vulnérables aux attaques XXE. Plus récemment, la CVE-2026-49825 a révélé que l’attribut xlink:href n’était pas pris en compte dans la liste des liens nettoyés par le module HTML Cleaner avant lxml 6.1.1.
Pour sécuriser lxml, il faut explicitement désactiver le chargement des entités externes et des DTD lors de la création du parseur :
- Passer
resolve_entities=Falseau constructeuretree.XMLParser - Ajouter
no_network=Truepour bloquer les requêtes réseau - Utiliser
dtd_validation=Falsesauf besoin explicite - Maintenir lxml à jour, les correctifs de sécurité sont réguliers
minidom, basé sur le module xml.dom, offre moins de contrôle fin sur ces paramètres. Pour du XML non fiable, il reste le choix le moins adapté des trois.

Parsing incrémental de fichiers XML volumineux avec Python
Pour un fichier XML de plusieurs centaines de mégaoctets, charger l’arbre complet en mémoire n’est pas viable. ElementTree propose iterparse(), qui lit le document nœud par nœud et permet de libérer la mémoire au fur et à mesure avec element.clear().
lxml a récemment introduit des classes XMLPullParser et HTMLPullParser pour le parsing incrémental, en reprenant le modèle de xml.etree.ElementTree disponible depuis Python 3.4. Ce rapprochement réduit l’avantage historique d’ElementTree pour les scénarios de streaming.
minidom ne propose aucun mécanisme de parsing incrémental. Le document entier est chargé en mémoire d’un bloc. Pour les fichiers volumineux, minidom est à écarter d’office.
Tableau comparatif : ElementTree, lxml et minidom pour parser du XML
| Critère | ElementTree | lxml | minidom |
|---|---|---|---|
| Installation | Bibliothèque standard | Package tiers (pip) | Bibliothèque standard |
| Modèle | Arbre léger | Arbre léger (API compatible) | DOM W3C complet |
| XPath | Sous-ensemble restreint | XPath 1.0 complet | Non supporté |
| Validation XSD | Non | Oui | Non |
| Parsing incrémental | iterparse, XMLPullParser | iterparse, XMLPullParser | Non |
| Sécurité XXE par défaut | Désactivé (Python 3.8+) | Configuration manuelle | Limité |
| Pretty print natif | indent() (Python 3.9+) | etree.tostring(pretty_print) | toprettyxml() |
Quel parseur XML Python choisir selon le cas d’usage
ElementTree couvre la majorité des besoins de parsing XML courants sans dépendance externe. Fichier de configuration, réponse d’API REST, sitemap : il fait le travail avec une empreinte mémoire réduite et une sécurité correcte par défaut.
lxml s’impose quand le projet exige du XPath avancé, de la validation XSD ou de la transformation XSLT. Le surcoût d’installation (dépendance C) et la vigilance nécessaire sur la sécurité sont le prix à payer pour ces fonctionnalités.
minidom reste pertinent dans un seul scénario précis : générer un affichage XML indenté lisible à partir d’un arbre déjà construit, via toprettyxml(). Pour le parsing lui-même, les deux autres options sont supérieures. Le choix se résume donc à une question de périmètre fonctionnel : bibliothèque standard suffisante, ou validation et XPath complets requis.

