Guide de Migration
Migration depuis Python lxml vers oxml
Faites évoluer vos flux XML du wrapper C libxml2 vers la sécurité mémoire du Rust pur, le streaming zéro-copie et un parallélisme sans GIL.
Pourquoi migrer ?
En Python, lxml a longtemps dominé en encapsulant les bibliothèques C libxml2 et libxslt. Cependant, les exigences modernes de production ont évolué :
- Sécurité Mémoire & Zéro Vulnérabilité :
libxml2a subi de nombreuses failles CVE (dépassements de tampon, use-after-free).oxmlapplique#![forbid(unsafe_code)]en Rust pur sans compromis. - Parallélisme Réel (Sans GIL) :
lxmlest restreint par le Global Interpreter Lock de Python. Les structures d'oxml(Document,XPath) implémententSendetSync, permettant un traitement multi-cœur fluide avec Rayon ou Tokio. - Compilation Croisée Sans Dépendance C : Aucun en-tête C requis (
libxml2-dev), aucun compilateur externe, fonctionnement identique sous macOS, Linux (glibc/musl) et Windows. - Prise en Charge WebAssembly :
oxmlcompile directement en WebAssembly (oxml-wasm), assurant la parité d'exécution sur le web et dans Cloudflare Workers.
Correspondance des Concepts
Python lxml.etree | Écosystème Rust oxml | Avantage Clé |
|---|---|---|
etree.fromstring(xml) | oxml::parse(xml) | Arène générationnelle rapide et compacte |
etree.parse(file) | oxml::stream::Reader::from_reader(f) | Tampon borné à 34 Ko |
tree.xpath("//book/text()") | doc.select("//book/text()") | Moteur XPath 1.0 complet avec raccourci entier $O(1)$ |
XPath(expr)(tree) | oxml::XPath::compile(expr)? | Expression précompilée partageable entre threads |
etree.iterparse(...) | reader.next_borrowed() | Emprunt &str zéro-copie sans allocation sur le tas |
etree.tostring(el) | oxml::format_xml(doc, ...) | Indentation, minification et balises vides personnalisables |
etree.XMLSchema(xsd).validate(doc) | xmlschema::validate(&doc, &schema) | Validateur XSD en Rust pur (95,2 % conformité W3C) |
| Scripts d'agents LLM sur mesure | oxml-mcp | 5 outils MCP natifs pour Claude, Cursor et agents IA |
Comparaisons de Code
1. Analyse et Requêtes XPath
En Python avec lxml :
=
=
=
# ['Dune']
En Rust avec oxml :
use ;
>
2. Flux à Haute Performance et Mémoire Bornée
En Python, iterparse impose un appel systématique à elem.clear() pour éviter les fuites mémoire :
# Requis pour libérer la mémoire en C
En Rust avec oxml, la mémoire est strictement bornée avec emprunt de tranches zéro-copie :
use ;
let mut reader = from_reader?;
while let Some = reader.next_borrowed?
3. Validation de Schémas XML (XSD)
En Python avec lxml :
=
=
=
En Rust avec xmlschema :
use ;
let schema = parse_schema?;
let doc = parse?;
let report = validate;
if report.is_valid else