Travailler avec XML en Rust : aperçu des bibliothèques clés
Le XML reste un format très utilisé pour les fichiers de configuration, l'échange de données dans les systèmes hérités et le stockage d'informations structurées. Dans l'écosystème Rust, il existe plusieurs bibliothèques matures pour travailler avec XML, chacune étant orientée vers des scénarios spécifiques : du parsing stream haute performance à la désérialisation pratique dans des structures fortement typées. Dans cet article, nous examinerons trois bibliothèques principales : quick-xml, roxmltree et serde_xml_rs, et fournirons des exemples pratiques de leur utilisation.
Bibliothèque quick-xml : parsing stream rapide
quick-xml est l'une des bibliothèques les plus rapides pour travailler avec XML en Rust. Elle est conçue pour une surcharge minimale et une faible consommation de mémoire. Le principe de fonctionnement principal est le parsing stream (streaming). Vous lisez le XML séquentiellement, en traitant les événements : balises ouvrantes et fermantes, texte, commentaires.
Cette approche est idéale pour traiter de gros fichiers (centaines de mégaoctets), où le modèle DOM (chargement de tout le document en mémoire) n'est pas applicable. La bibliothèque prend en charge à la fois la lecture et l'écriture de XML.
Exemple : lecture d'une configuration avec quick-xml
Supposons que nous ayons un simple fichier XML config.xml :
<config> <app name="my_app"> <port>8080</port> <host>localhost</host> </app></config>Parsing avec quick-xml et son API de haut niveau Reader :
use quick_xml::Reader;use quick_xml::events::Event;
fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <config> <app name="my_app"> <port>8080</port> <host>localhost</host> </app> </config> "#;
let mut reader = Reader::from_str(xml); let mut txt = Vec::new(); let mut in_port = false;
loop { match reader.read_event() { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"port" { in_port = true; } } Ok(Event::Text(ref e)) => { if in_port { txt.push(e.unescape()?.to_string()); in_port = false; } } Ok(Event::Eof) => break, Err(e) => panic!("Erreur à la position {} : {:?}", reader.buffer_position(), e), _ => () } } println!("Valeur du port : {}", txt[0]); Ok(())}Comme vous pouvez le voir, le code est impératif et nécessite une gestion manuelle de l'état, mais offre un contrôle total sur le processus de parsing.
Bibliothèque roxmltree : travail avec l'arbre DOM
Si vous préférez travailler avec XML comme un arbre d'objets (DOM), alors roxmltree est un excellent choix. Elle charge l'intégralité du document en mémoire et fournit des méthodes pratiques pour la navigation : recherche par requêtes de type XPath, parcours des descendants, récupération des attributs.
La bibliothèque ne prend pas en charge la sérialisation (écriture XML), mais pour la lecture et l'analyse, elle est très pratique. Un avantage important est la vérification stricte des espaces de noms (namespaces).
Exemple : recherche d'éléments avec roxmltree
use roxmltree::Document;
fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <catalog> <book id="1"> <title>Rust in Action</title> <author>Tim McNamara</author> </book> <book id="2"> <title>Programming Rust</title> <author>Jim Blandy</author> </book> </catalog> "#;
let doc = Document::parse(x Aussi dans la bibliothèque
Blade PHP : guide complet avec exemples pratiques
Migrations de bases de données en Swift : outils et pratiques pour iOS/macOS
Jetons JWT en C++ : implémentation et vérification avec jwt-cpp
Génération Swagger/OpenAPI en Kotlin : guide complet des outils
Envoi de SMS en Java : aperçu des bibliothèques API et outils