Anuncios

Bienvenidos sean a este post, hoy veremos como leer archivos de formato XML.

Anuncios

Ante todo debemos crear un nuevo proyecto por medio de cargo al cual llamaremos xml_reader:

tinchicus@dbn001vrt:~/lenguajes/rust$ cargo new xml_reader
Anuncios

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"
Anuncios

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"
Anuncios

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>
Anuncios

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());
	}
	)
}
Anuncios

Si vienen de mis posts anteriores notamos la primer diferencia con esta linea:

extern crate xml;
Anuncios
Anuncios

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);
Anuncios

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);
Anuncios

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());
}
)
Anuncios

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
Anuncios

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$
Anuncios
Nota:
Sobre el bucle for hablamos en este post.
Anuncios

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.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50