Parser du XML en Python revient à choisir entre plusieurs bibliothèques aux comportements très différents. ElementTree, lxml, minidom et SAX ne lisent pas un fichier XML de la même façon, ne consomment pas la même quantité de mémoire et n’exposent pas la même API. Avant d’écrire la première ligne de code, il est utile de mesurer ces écarts pour éviter de devoir tout réécrire.
Comparatif des bibliothèques pour parser du XML en Python
Le tableau ci-dessous confronte les quatre solutions les plus utilisées selon quatre critères opérationnels : disponibilité sans installation, modèle de lecture, support XPath et adaptation aux gros fichiers.
| Bibliothèque | Installation | Modèle | XPath | Gros fichiers |
|---|---|---|---|---|
| ElementTree | Incluse (stdlib) | DOM (arbre en mémoire) | Partiel | Limité |
| lxml | pip install lxml | DOM + SAX | Complet | Oui |
| minidom | Incluse (stdlib) | DOM | Non | Non |
| SAX (xml.sax) | Incluse (stdlib) | Événementiel | Non | Oui |
ElementTree couvre la grande majorité des cas courants sans dépendance externe. lxml s’impose dès que la validation de schéma ou un XPath complet devient nécessaire. SAX reste la seule option viable quand le fichier XML dépasse la mémoire disponible.
Parser un fichier XML avec ElementTree : les opérations de base
ElementTree charge l’intégralité du document sous forme d’arbre. La racine du document s’obtient avec getroot(), et chaque noeud expose ses enfants, ses attributs et son texte directement.
La séquence minimale pour lire un fichier XML :
- Charger le fichier :
import xml.etree.ElementTree as ET, puistree = ET.parse('fichier.xml')etroot = tree.getroot(). Si le XML est déjà une chaîne,ET.fromstring(chaine)retourne directement l’élément racine. - Parcourir les enfants : une boucle
for child in rootdonne accès au tag et aux attributs de chaque noeud viachild.tagetchild.attrib. Pour descendre plus profond,root.iter('nom_tag')parcourt récursivement tous les éléments portant ce nom. - Lire le texte et les attributs :
element.textretourne le contenu textuel,element.get('attribut')retourne la valeur d’un attribut ou None si absent, ce qui évite une KeyError.
Pour modifier un fichier XML existant, ElementTree permet de changer element.text, d’ajouter un attribut avec element.set('clé', 'valeur') et de sauvegarder avec tree.write('fichier_modifié.xml'). La structure du document d’origine est conservée.

XPath et espaces de noms : deux points de friction fréquents
ElementTree supporte un sous-ensemble d’XPath suffisant pour cibler des éléments sans boucle manuelle. root.findall('./book/title') retourne tous les titres enfants d’un noeud book. root.find('.//year') cherche récursivement le premier élément year dans tout l’arbre.
Les espaces de noms XML posent un problème pratique : un tag du type {http://www.w3.org/2005/Atom}entry ne peut pas être interrogé sans préfixe. ElementTree gère cela via un dictionnaire de namespaces passé en second argument : root.findall('atom:entry', {'atom': 'http://www.w3.org/2005/Atom'}). Sans ce dictionnaire, find et findall retournent None sans avertissement.
lxml supprime cette friction : lxml résout automatiquement les espaces de noms et propose un XPath complet avec la méthode xpath() qui accepte des prédicats complexes et des fonctions XPath standard.
SAX et lxml pour les fichiers XML volumineux
Quand un fichier XML représente plusieurs centaines de mégaoctets, charger l’arbre complet en mémoire n’est pas viable. SAX (Simple API for XML) adopte un modèle événementiel : le parseur lit le flux séquentiellement et déclenche des callbacks à chaque ouverture et fermeture de balise, sans jamais construire l’arbre entier.
Le coût de cette efficacité mémoire est la complexité du code. SAX exige d’implémenter une classe héritant de xml.sax.ContentHandler et de gérer l’état manuellement entre les événements. Naviguer « en arrière » dans le document est impossible.
lxml propose une alternative intermédiaire avec iterparse : il construit l’arbre de façon incrémentale et permet de libérer les éléments déjà traités. iterparse de lxml combine la simplicité d’ElementTree et la frugalité mémoire de SAX pour la plupart des fichiers de taille intermédiaire.
Un cas concret : lire des données structurées de type facture XML
Le XML dépasse le fichier d’exemple : la facturation électronique B2B repose sur des documents XML structurés selon des normes comme UBL, utilisées dans plusieurs pays européens. Un programme Python qui traite ces fichiers applique exactement les mêmes méthodes – ElementTree ou lxml, find, findall, get – mais sur des structures de données à valeur légale.
Ce contexte illustre une distinction importante : parser le XML et valider les données métier sont deux opérations distinctes. Lire un élément Amount avec ElementTree retourne une chaîne. Vérifier que ce montant est cohérent avec les lignes de détail relève d’une logique métier séparée. Les fichiers XML structurés sont conçus pour un traitement automatique, ce qui implique d’aller au-delà de la simple lecture des noeuds.
La séparation entre le document XML exploitable par un logiciel et un PDF lisible par une personne illustre aussi pourquoi le format XML n’est pas interchangeable avec un export PDF : les deux portent des informations différentes pour des usages différents.
Quelle bibliothèque Python choisir pour parser du XML
Le choix se résume à trois critères mesurables : la taille du fichier, la nécessité d’un XPath complet, et la présence d’une contrainte d’environnement qui interdit les dépendances externes.
ElementTree répond à la grande majorité des besoins courants sans installation. lxml devient le meilleur choix dès qu’un XPath complet, la validation de schéma XSD ou le traitement de fichiers volumineux est au programme. minidom reste présent dans la stdlib mais son API verbeuse lui vaut d’être rarement préférée à ElementTree. SAX ne se justifie que pour du streaming sur des fichiers dont la taille dépasse la mémoire disponible.
Pour un script de traitement de données structurées en production, lxml est la bibliothèque la plus complète : performances, XPath, validation et gestion des namespaces sans contournement. Pour un environnement contraint ou un script ponctuel, ElementTree suffit et évite toute dépendance externe.

