Trabajo con XML en Rust: bibliotecas y herramientas
XML (eXtensible Markup Language) sigue siendo uno de los formatos clave para el intercambio de datos, archivos de configuración y gestión documental. El ecosistema de Rust ofrece varias soluciones maduras para trabajar con XML, desde el análisis de flujo de alto rendimiento hasta la serialización conveniente a través de serde. En este artículo, analizaremos las tres herramientas más populares: quick-xml, roxmltree y serde-xml-rs.
¿Por qué Rust para trabajar con XML?
Rust combina la velocidad de C/C++ con la seguridad de la memoria. Al procesar archivos XML grandes (por ejemplo, registros médicos o datos geoespaciales), esto es crítico. Las bibliotecas para XML en Rust están escritas desde cero en Rust (sin enlaces a C), lo que garantiza seguridad en la concurrencia y un rendimiento predecible.
Bibliotecas para trabajar con XML en Rust
- quick-xml — analizador de flujo de alto rendimiento (estilo SAX) y escritor. Consumo mínimo de memoria, ideal para archivos grandes.
- roxmltree — analizador DOM que construye un árbol del documento. Conveniente para navegación y modificación.
- serde-xml-rs — serialización/deserialización de estructuras de Rust hacia/desde XML a través de la crate
serde. Máxima integración con el sistema de tipos.
Instalación
Agregue las dependencias en Cargo.toml:
[dependencies]quick-xml = "0.36" # analizador de flujoroxmltree = "0.20" # analizador DOMserde-xml-rs = "0.6" # serialización (junto con serde)serde = { version = "1.0", features = ["derive"] }Análisis de XML con quick-xml
quick-xml funciona en modo Reader — lee tokens secuencialmente (apertura de etiqueta, texto, cierre de etiqueta). Esto ahorra memoria: procesa el documento por partes sin cargarlo por completo.
Ejemplo: lectura de un feed RSS
use quick_xml::Reader;use quick_xml::events::Event;
fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <rss version="2.0"> <channel> <title>Noticias de Rust</title> <item> <title>Se lanzó Rust 1.78</title> <link>https://example.com/rust-1.78</link> </item> </channel> </rss>"#;
let mut reader = Reader::from_str(xml); reader.trim_text(true);
let mut buf = Vec::new(); let mut in_item = false;
loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"item" { in_item = true; } } Ok(Event::Text(ref e)) => { if in_item { let text = e.unescape()?; println!("{}", text); } } Ok(Event::End(ref e)) => { if e.name().as_ref() == b"item" { in_item = false; } } Ok(Event::Eof) => break, Err(e) => eprintln!("Error: {}", e), _ => () } buf.clear(); } Ok(())}Salida: los títulos de todos los <item>.
Análisis DOM con roxmltree
roxmltree carga todo el XML en un árbol. Esto es útil cuando necesita acceder repetidamente a diferentes nodos o modificar la estructura.
Ejemplo: extracción de atributos y texto
use roxmltree::Document;
fn main() { let data = r#" <config version="1.0"> <database> <host>localhost</host> <port>5432</port> </database> </config>"#; También en la biblioteca
Trabajo con imágenes en TypeScript: bibliotecas, herramientas y ejemplos de código
Limitación de Tasa en Java: bibliotecas, algoritmos e implementación
nlohmann/json para C++: guía completa con ejemplos