Bienvenidos sean a este post, hoy veremos como leer archivos de formato XML.
Ante todo debemos crear un nuevo proyecto por medio de cargo al cual llamaremos xml_reader:
tinchicus@dbn001vrt:~/lenguajes/rust$ cargo new xml_reader
Una vez creado debemos hacer una pequeña modificacion en el archivo Cargo.toml, en la seccion dependencies agregaremos la siguiente linea:
xml-rs = "0.8"
Esta es para indicarle que vamos a utilizar esta libreria por fuera de las estandar que posee el lenguaje, antes de continuar veamos como quedo el archivo:
Cargo.toml
[package]
name = "xml_reader"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
xml-rs = "0.8"
Recuerden que en la seccion dependencies siempre debemos informar todos los crates o librerias que usaremos en nuestro codigo, lo siguiente sera crear un archivo xml para poder procesarlo, hagan un archivo nuevo que llamaremos archivo.xml dentro de la raiz del proyecto y le agregaremos el siguiente codigo:
archivo.xml
<ElementoDocumento param="valor">
<PrimerElemento>
Un poco de texto per jodere :D
</PrimerElemento>
<SegundoElemento param2="algo">
Pre-texto <Inline>Texto en linea</Inline> Post-texto.
</SegundoElemento>
</ElementoDocumento>
Este es un codigo simple de xml con un raiz y dos elementos internos pero a nosotros no nos interesa tanto esto sino como poder leerlo desde Rust y para ello ahora iremos al archivo main.rs generado y lo modificaremos de la siguiente manera:
main.rs
extern crate xml;
use xml::reader::EventReader;
use std::fs::File;
use std::io::BufReader;
fn main() -> std::io::Result<()>
{
let archivo=File::open("archivo.xml").unwrap();
let lector = BufReader::new(archivo);
let parser_xml = EventReader::new(lector);
Ok(
for evento in parser_xml
{
println!("{:?}", evento.unwrap());
}
)
}
Si vienen de mis posts anteriores notamos la primer diferencia con esta linea:
extern crate xml;
Esta linea sera la encargada de importar y descargar la libreria que nos permite manejar todo lo relacionado con xml, por esta razon agregamos la modificacion en dependencies, despues definimos las librerias que usaremos, la primera sera justamente para leer nuestro XML a traves de los eventos en el mismo, las otras seran para abrir los archivos y acceder al contenido, tal como vimos en este post, devuelta utilizamos el que retorne un Result para el caso que suceda un error, lo siguiente seran estas dos lineas:
let archivo=File::open("archivo.xml").unwrap();
let lector = BufReader::new(archivo);
La primera sera para poder abrir el archivo que analizaremos, la siguiente sera para almacenar todo su contenido en un buffer, luego comenzara la magia con esta linea:
let parser_xml = EventReader::new(lector);
Esta sera la encargada de diferenciar los distintos elementos que poseemos en un XML, para ello enviamos todo lo almacenado en nuestro buffer llamado lector, despues tendremos este bloque:
Ok(
for evento in parser_xml
{
println!("{:?}", evento.unwrap());
}
)
En este caso tenemos el Ok para devolver la informacion, en caso de que sea correcto, para esta ocasion usamos un bucle for, el cual pasara por todos los elementos que esten almacenados en parser_xml, el objeto que definimos anteriormente, dentro de este bloque mostraremos cada evento que se encuentra en el objeto, observen dos detalles:
- Usamos el operador de depuracion (:?) porque de lo contrario no compilara porque solamente se muestra con este
- Usamos un unwrap para que en caso de un error nos lo devuelva en pantalla
Con esto podemos compilarlo para ver su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/xml_reader$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/xml_reader`
StartDocument(1.0, UTF-8, None)
StartElement(ElementoDocumento, {"": "", "xml": "http://www.w3.org/XML/1998/namespace", "xmlns": "http://www.w3.org/2000/xmlns/"}, [param -> valor])
Whitespace(
)
StartElement(PrimerElemento, {"": "", "xml": "http://www.w3.org/XML/1998/namespace", "xmlns": "http://www.w3.org/2000/xmlns/"})
Characters(
Un poco de texto per jodere :D
)
EndElement(PrimerElemento)
Whitespace(
)
StartElement(SegundoElemento, {"": "", "xml": "http://www.w3.org/XML/1998/namespace", "xmlns": "http://www.w3.org/2000/xmlns/"}, [param2 -> algo])
Characters(
Pre-texto )
StartElement(Inline, {"": "", "xml": "http://www.w3.org/XML/1998/namespace", "xmlns": "http://www.w3.org/2000/xmlns/"})
Characters(Texto en linea)
EndElement(Inline)
Characters( Post-texto.
)
EndElement(SegundoElemento)
Whitespace(
)
EndElement(ElementoDocumento)
EndDocument
tinchicus@dbn001vrt:~/lenguajes/rust/xml_reader$
Nota: Sobre el bucle for hablamos en este post.
En resumen, hoy hemos visto lo mas basico de lo mas basico para poder leer un archivo XML, mas adelante desarrollare un ejemplo mejor, pero hemos visto las librerias necesarias, las modificaciones que se deben usar para que se descarguen correctamente todas las dependencias necesarias, un codigo simple y efectivo para poder acceder y leer un archivo XML, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
