
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

Hasta pronto, que estén bien.
Johny.






