07 marzo 2008

Ubuntu... te habla


En el blog de una amiga ha aparecido una nota muy interesante, o al menos entretenida.
Mediante un programa, el sistema Ubuntu adquiere la capacidad de hablarte.
Con más detalle pueden leer la nota en el siguiente enlaze... que lo disfruten!

Ubuntu... te habla...!

Hasta pronto, que estén bien.


Johny.

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.

01 marzo 2008

Gambas - Escribir un XML


Los archivos XML forman hoy en dia un estandar aceptado globalmente para la transferencia de información.
Es de libre uso, cumple especificaciones, y es independiente tanto del lenguaje como de la plataforma.Esto quiere decir, que mediante este formato pueden comunicarse sistema hechos en distintos lenguajes y que corran sobre distintas plataformas.
Ya que tanto Gambas como Java me parecen lenguajes muy interesantes, poderosos y de facil aprendizaje; voy a aportar mis escasos conocimientos para que queden plasmados en este blog.

Bien, en esta oportunidad vamos a ver algo de Gambas respecto al XML.
Gambas posee distintos Componentes, entre ellos tenemos el de Programción XML. El mismo se compone de:

  • gb.xml
  • gb.xml.xslt
  • gb.xml.rpc

El primero cuenta con las siguientes clases:

  • xmldocument
  • xmlnode
  • xmlreader
  • xmlreadernodetype
  • xmlwriter

Ejemplo:

Se tiene una pequeña librería, y recientemente cuanta con internet y abrió un sucursal en un pueblo cercano. Se decea enviar por internet los datos de los nuevos libros que hayan ingresado para que la sucursal este al tanto de las novedades.
Supongamos que se tiene el siguiente esquema


Y se desea enviar a la sucursal solamente los datos correspondientes a dos libros nuevos que entraron en el dia.
En este caso el sistema que posea la librería deberia poder generar un pequeño archivo xml, y se pueda transmitir por internet para que la sucursal absorba esa información.
Definicion de Archivo
Nuestro archivo tendria la siguiente definición (sin los *, les puse porque sino no se mostraba bien):

<*?xml version=”1.0”?>
<*envios>
<*transaccion_id>115451
<*transaccion_tipo>1
<*libro>
<*id_libro>1235487
<*nombre_libro>odisea
<*editorial>anaya
<*genero>clasica
<*/libro>
<*/envios>

Hecho esto, procedemos a escribir el codigo fuente para escribir esa informacion en un archivo.
Creamos un proyecto por consola, que haga referencia a gb.xml
Dentro del main escribimos el siguiente codigo:

DIM xml AS XmlWriter
xml = NEW XmlWriter

xml.Open("", TRUE)
xml.StartElement("envios")
xml.Element("transaccion_id", "115451")
xml.Element("transaccion_tipo", "1")
xml.Element(“transaccion_fecha” , “20080228”)
xml.StartElement("libro")
xml.Element("id_libro", "1235487")
xml.Element("nombre_libro", "odisea")
xml.Element("editorial", "anaya")
xml.Element("genero", "clasica")
xml.EndElement()
xml.EndElement()
PRINT xml.EndDocument()

Primero, se declara y se instancia un XmlWriter en “xml”, luego abrimos un archivo xml, y comienza su escritura.
StartElement, seria la etiqueta de inicio
Element, seria el elemento en si, pero cuando se trata de una estructura simple como por ejemplo “1235487”, entonces se puede resumir el StartElement, Element y EndElement en una sola linea colocando primero la etiqueta, y luego el contenido de la etiqueta, entonces quedaria “xml.Element("id_libro", "1235487")”
En el final, el PRINT xml.EndDocument, nos mostrará por consola la salida del documento xml.

Esta es con propósito de ver como quedaria, sin embargo debemos cambiar un par de cositas para que el código cree un archivo xml con la estructura creada.

xml.Open(User.Home & "/envio.xml", TRUE)
...
xml.EndDocument()

En el Open, agregamos referencia a un archivo físico para que lo cree, y en el EndDocument le quitamos en PRINT.
De esta forma el EndDocument generará el archivo xml.
Eso es todo, si van a su directorio Home, verán el archivo creado.
Queda para la siguiente entrega la absorción de un documento xml.

Hasta pronto, que estén bien.


Johnyx.