Modèles de Production
Livre de Recettes XML de Production
Modèles architecturaux testés sur le terrain pour le streaming haute performance, la mémoire bornée et la sécurité.
Streaming Échelle Gigaoctet
Lors du traitement de jeux de données XML de plusieurs gigaoctets (dumps Wikipédia, flux OpenStreetMap ou journaux de transactions financières), construire un DOM en mémoire provoque inévitablement des pannes d'épuisement de mémoire (OOM).
oxml propose Reader::next_borrowed(), qui parcourt les événements en empruntant des tranches de chaînes directement dans le tampon interne sans aucune allocation sur le tas.
Modèle : Extraction d'Entités Zéro Copie
use ;
use File;
use BufReader;
Protection Déni de Service
Les analyseurs C hérités comme libxml2 sont notoirement vulnérables aux attaques par expansion d'entités XML (« Billion Laughs » et explosion quadratique), où des entités DTD récursives multiplient la consommation de RAM de manière exponentielle.
Atténuation Billion Laughs
oxml neutralise les attaques par déni de service par conception :
- Limites de Récursion d'Entités : Le remplacement des entités générales est strictement borné.
- Plafonds de Profondeur Générationnels : La profondeur d'imbrication est limitée pour éviter tout débordement de pile.
- Mémoire Bornée : Sans pointeurs bruts, la mémoire ne peut être ni fragmentée ni bloquée par des dépendances circulaires.
use Reader;
// Charge utile malveillante : expansions d'entités imbriquées
let attack_xml = r#"<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
]>
<root>&lol3;</root>"#;
let mut reader = from_str;
// Garanti : terminaison sûre avec erreur explicite, zéro emballement mémoire.
Traversée d'Espaces de Noms
En XML 1.0, les éléments sans préfixe d'un document avec espace de noms appartiennent à l'espace par défaut (xmlns="http://example.com/ns"). Selon la spécification W3C XPath 1.0, les noms non préfixés dans une expression XPath ne correspondent qu'aux éléments sans espace de noms.
Le Problème dans les Outils Hérités
Avec lxml ou les outils standards, interroger un document ayant un espace de noms par défaut avec //entry retourne 0 résultat, déroutant les développeurs :
Hello
La Solution oxml
Liez un préfixe explicite à l'URI de l'espace de noms. L'outil oxml-cli ainsi que l'API Rust permettent de lier des préfixes stables :
Approche CLI :
Approche API Rust :
use Document;
use Context;
let xml = r#"<feed xmlns="http://www.w3.org/2005/Atom"><title>Release</title></feed>"#;
let doc = parse?;
let mut ctx = new;
ctx.register_namespace;
let nodes = doc.select_with_context?;
assert_eq!;
Validation avec Schéma XML (XSD)
Validez vos documents par rapport aux définitions d'entreprise XSD dans vos flux CI/CD :
use Validator;
let schema_source = read_to_string?;
let validator = from_str?;
let xml_input = read_to_string?;
match validator.validate