06 marzo 2008

Gambas - Leer un XML


Bue, lo prometido es deuda, aqui le dejo una pequeñisima reseña con un pequeñisimo y sencillo ejemplo de como pueden leer el archivo xml que se generó en la nota anterior, sobre escritura de XML con Gambas.
Un par de tips que olvidé comentar sobre este tema son los siguientes:
- Gambas utiliza una "libreria" de nombre libxml, adaptada a Gambas por el Sr. Daniel Campos Fernandez (puedo equivocarme si es asi dejen un comentario y corrigo esta entrada) para poder procesar los archivos XML.
- La implementación por medio de esta libreria (y de Gambas) puede parecer un poco larga, pero es muy sencilla de entender. Además recuerden que Gambas es un leguaje Orientado a Objetos, por lo que se puede implementar en "clases" y por medio de "métodos" y haciendo uso de "polimorfismo" se pueden crear aplicaciones bastante robustas para luego solo mandar "mensajes" a las mismas para que hagan todo el trabajo ellas solas. Esto implica que en un principio tengan que escribir (copiar, pegar y modificar) un poco mas de código que en otros lenguajes, pero son solo las bases, luego podran re-utilizar todo para distintos propositos haciendo uso de características de Orientado a Objetos.
- Tanto este, como el anterior ejemplo estan escritos para Gambas2, no le he probado en versiones anteriores.
- Este ejemplo hace uso del archivo "envio.xml" generado en el ejemplo anterior y que se encuentra en el directorio (carpeta) HOME de su usuario ("/home/SUNOMBREDEUSUARIO/envio.xml").

Para el ejemplo que les propongo tienen que crear un nuevo proyecto, tildar el enlaze para hacer uso del complemento XML.
Una vez creado el proyecto, agregan:
- Un TreeView (Vista de Arbol) que se encuentra en "Form" (cuarta fila, tercer item), y le cambian el nombre a "arbol".
- Un Button (Botón), que le cambian el nombre a "btnAplicacionCerrar".

Hacen doble click sobre el FORMULARIO para ir a la parte de código del mismo, luego borran todo lo que haya en la pantalla de codificación. Copian y pegan el código que les dejo a continuación.

El código se encuentra comentado (todo lo que esta en una LINEA despues del ' es un comentario) y hago uso de estructuras básicas de cualquier lenguaje. Por lo cual no creo necesario explicar en detalle el proceso que realiza.
Ejemplo de Lectura de un Archivo XML:



' Gambas class file

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()

DIM rdorecorrido AS Boolean = FALSE
DIM recorrido AS Boolean = TRUE
' Apertura de archivo
DIM xml AS XmlReader ' Declaración
xml = NEW XmlReader ' Instanciación
TRY xml.Open(User.Home & "/envio.xml") ' Apertura del archivo.
IF ERROR THEN
Message.Error("No se pudo abrir el archivo xml") ' Si hay algun error mostramos un mensaje amigable al usuario
RETURN
ENDIF
' Recorrido de archivo
TRY xml.Read() ' Se lee en el archivo, cada lectura es un avance en el nodo del archivo

DO WHILE recorrido = TRUE ' Mientras la var recorrido sea V hacer:
IF xml.Node.Type = XmlReaderNodeType.Element THEN ' Si el tipo de Nodo es igual a un Element(=1) entonces:
IF xml.Node.Name = "envios" THEN ' Si el nombre del Nodo es "envio" entonces:
RellenaArbol(xml)
rdorecorrido = TRUE
ENDIF
ENDIF
' Lectura del siguiente nodo
TRY xml.Read()
IF ERROR THEN
Message.Error("Se ha producido un error en el recorrido del archivo")
RETURN
ENDIF
' Si se llega al final del archivo se debe detener el DO WHILE
IF xml.Eof THEN
recorrido = FALSE
ENDIF
LOOP

IF rdorecorrido = FALSE THEN
Message.Error("El xml no contiene datos de transaccion")
ENDIF
' Cierre de archivo
TRY xml.Close()
END

PUBLIC SUB RellenaArbol(xml AS XmlReader) ' Aqui se va a rellenar el "arbol"

DO WHILE TRUE
TRY xml.Read() ' Se lee el siguiente nodo
IF ERROR THEN RETURN

IF xml.Node.Type = XmlReaderNodeType.Element THEN
IF xml.Node.Name = "libro" THEN ' Si el nombre del nodo es "libro" entonces llamamos a "RellenaItem"
RellenaItem(xml)
ENDIF
ELSE
IF xml.Node.Name = "envios" THEN ' Si el nombre del nodo es "envios" entonces hemos terminado la etiqueta de envios
IF xml.Node.Type = XmlReaderNodeType.EndElement THEN BREAK ' Si es un "elemento final" => salimos
ENDIF
ENDIF
LOOP

END

PUBLIC SUB RellenaItem(xml AS XmlReader)

DIM Limite AS Integer
DIM sNodo AS String

TRY xml.Read()
IF ERROR THEN RETURN
DO WHILE TRUE
IF xml.Node.Type = XmlReaderNodeType.Element THEN
SELECT CASE xml.Node.Name ' Estructura "Segun" o "Case", reemplaza a un "if" anidado con ciertas particularidades
CASE "id_libro"
TRY xml.Read()
TRY Arbol.Add(sNodo & "-id_libro", "Identificación del Libro: " & xml.Node.Value, NULL, sNodo) ' Se agrega un item con el valor de id_libro
CASE "nombre_libro"
TRY xml.Read()
TRY Arbol.Add(sNodo & "-nombre_libro", "Nombre del Libro: " & xml.Node.Value, NULL, sNodo)
CASE "editorial"
TRY xml.Read()
TRY Arbol.Add(sNodo & "-editorial", "Editorial: " & xml.Node.Value, NULL, sNodo)
CASE "genero"
TRY xml.Read()
TRY Arbol.Add(sNodo & "-genero", "Género: " & xml.Node.Value, NULL, sNodo)
END SELECT
ELSE
IF xml.Node.Name = "libro" THEN BREAK ' Si llegamos al final de la etiqueta libro, entonces se rompe secuencia
ENDIF
TRY xml.Read()
IF ERROR THEN BREAK
LOOP
END

PUBLIC SUB btnAplicacionCerrar_Click()

ME.Close ' Si hacen click sobre el boton "Cerrar" entonces este comando nos cierra la pequeña aplicación.

END


Espero les sea útil y les haya ayudado en algo.
Hasta pronto, que estén bien.

Johny.

No hay comentarios:

Publicar un comentario