Trabajo con XML en Rust: bibliotecas quick-xml, roxmltree y serde_xml_rs

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con XML en Rust: revisión de las bibliotecas clave



XML sigue siendo un formato demandado para archivos de configuración, intercambio de datos en sistemas heredados y almacenamiento de información estructurada. En el ecosistema de Rust existen varias bibliotecas maduras para trabajar con XML, cada una orientada a escenarios específicos: desde el análisis de flujo de alto rendimiento hasta la deserialización conveniente en estructuras fuertemente tipadas. En este artículo revisaremos tres bibliotecas principales: quick-xml, roxmltree y serde_xml_rs, y proporcionaremos ejemplos prácticos de su uso.



Biblioteca quick-xml: análisis de flujo rápido



quick-xml es una de las bibliotecas más rápidas para trabajar con XML en Rust. Está diseñada para una sobrecarga mínima y un bajo consumo de memoria. El principio de funcionamiento principal es el análisis de flujo (streaming). Lees XML secuencialmente, procesando eventos: etiquetas de apertura y cierre, texto, comentarios.



Este enfoque es ideal para procesar archivos grandes (cientos de megabytes), donde el modelo DOM (cargar todo el documento en memoria) no es aplicable. La biblioteca admite tanto lectura como escritura de XML.



Ejemplo: lectura de configuración con quick-xml



Supongamos que tenemos un archivo XML simple config.xml:



<config>    <app name="my_app">        <port>8080</port>        <host>localhost</host>    </app></config>


Análisis utilizando quick-xml y su API de alto nivel 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!("Error at position {}: {:?}", reader.buffer_position(), e), _ => () } } println!("Port value: {}", txt[0]); Ok(())}


Como se puede ver, el código es imperativo y requiere gestión manual del estado, pero proporciona control total sobre el proceso de análisis.



Biblioteca roxmltree: trabajo con árbol DOM



Si prefieres trabajar con XML como un árbol de objetos (DOM), roxmltree es una excelente opción. Carga todo el documento en memoria y proporciona métodos convenientes para la navegación: búsqueda mediante consultas similares a XPath, recorrido de descendientes, obtención de atributos.



La biblioteca no admite serialización (escritura de XML), pero para lectura y análisis es muy conveniente. Una ventaja importante es la validación estricta de espacios de nombres (namespaces).



Ejemplo: búsqueda de elementos con 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

Recommendations