Trabajo con XML en Rust: análisis, creación y serialización de datos

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: 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>"#;

Recommendations