Delphi 2010 y XML (2)

Siguiendo con el tópico de XML veamos ahora algo de código. Como ejemplo tomaremos la estructuta XML del post anterior y lo crearemos por código.

A la hora de trabajar con documentos XML lo podemos hacer creando una instancia de la clase TXMLDocument o usando el control del mismo nombre que encontraremnos en la paleta de controles bajo Internet.

Un par de cosas antes de continuar, un nodo como por ejemplo <libro> se denomnina elemento, en XML todos lo que se crean son nodos, elemento por ejemplo es un tipo especial de nodo, un atributo también es un tipo de nodo, el contenido de un elemento tambien es un tipo de nodo.

Creemos una ventana como la que sigue para hacer nuestras pruebas:

Elijamos el  control creado y en la venatana de Propiedades podemos ver una llamada DOMVendor, en ella podremos elejir entre las disponibles, actualmente MSXML, Xerces y ADOM. Cual elejimos? depende de nuestras preferencia y el uso que le demos, si no sabes cual, apunta a lo seguro (¿?) y elije MSXML de Microsoft. Para fnes de este ejecicio expandimos la propiedad Options y ponemos a True doNodeAutoIndent, esto permitira que el texto que obtengamos aparezca indentado para ver mejor la jerarquía (esto es opcional, el formato XML no rquiere indentación e incluso todo el texto puede ir en una sola línea).

Ahora en el evento OnClick de nuestro botón agregaremos algo de código para crear la estructura planteada:

procedure TForm1.Button1Click(Sender: TObject);
var
DatoNode,
LibroNode,
RootNode: IXMLNode;
XMLString: string;
begin
XMLDocument1.Active := True;                // Debemos activar el Documento para poder trabajar
RootNode := XMLDocument1.AddChild('libros');  // Creamos el nodo raíz
LibroNode := RootNode.AddChild('libro');      // Agregamos un elemento debajo de raíz
LibroNode.Attributes['tipo'] := 'novela';     // Le agregamos un atributo a nuestro elemento
DatoNode := LibroNode.AddChild('nombre');     // Agregamos 2 nodos debajo del elemento Libro
DatoNode.Text := 'La Casa Verde';
DatoNode := LibroNode.AddChild('autor');
DatoNode.Text := 'Vargas Llosa';

XMLDocument1.SaveToXML(XMLString);            // Grabamos el documento en texto
Memo1.Text := XMLString;                      // y lo mostramos
end;

Ejecutemos el programa y obtendremos el siguiente resultado al hacer click en el boton.

En la línea 17 he usado XMLDocument1.SaveToXML(var XML: String) que toma la estructura creado y la convierte en texto. Del mismo modo pude haber usado SavetoFile() que grabariá el contenido en un archivo.

Lo mismo podemos hacer si usamos LoadFromXML() ó LoadFromFile().

Bueno eso es todo por ahora. En el siguiente post veremos como recorrer el Documento XML y obtener valores.

 

 

 

 

Anuncios

Delphi y XML (1)

XML que significa eXtenible Markup Language (lenguaje de marcas extensible) es para mi, muy a pesar de su nombre, no un lenguaje si no un formato para representar data/información arbitraria (por eso lo de extensible).

XML al igual que HTML son derivados de un concepto más genérico llamado SGML, por lo que comparten los conceptos jerárquicos así como la idea de tags o etiquetas, de ahi que ambos se vean muy parecidos a simple vista.

XML a cobrado notoriedad desde hace algunos años atrás como una forma muy legible (para humanos) de representar casi cualquier tipo información, al ser puramente texto con reglas explícitas para manejar caracteres especiales y no imprimibles, lo hace muy fácil de transportar entre plataformas y lenguajes.

XML tiene la particularidad de poder almacenar tanto la información en sí, como meta-información en la forma de tags y atributos, por ejemplo:

<libros>
  <libro tipo="novela">
    <nombre>La casa verde</nombre>
    <autor>Mario Vargas Llosa</autor>
  </libro>
</libros>

Como se ve no es necesario conocer la intención del autor para saber de que se trata. Es bastante autodescriptivo, incluso se puede notar la jerarquía entre los elemetos.

Estas características lo hacen muy interesante como medio de almacenar y transportar información entre sistemas diferentes, en plataformas diferentes o lenguajes de programación distintos. Sin embargo tanta maravilla no es gratis. La información así descrita ocupa mucho más espacio que otros formatos binarios, la tarea de “parsear” la información tanmbién es más pesada. La carga para el humano lector es más fácil, pero para la máquina es más costoso, claro que para eso están las máquinas, para reducir nuestro esfuerzo.  NOTA: Estas consideraciones deberían tomarse en cuenta cuando se transmite grandes volumenes de información y/o el tiempo de procesamiento debe ser mínimo.

Delphi puede manejar XML usando diferentes mecanismos. Delphi 2009/2010 incluye al menos 3 motores distintos, versiones previas usan el Microsoft MSXML, aunque también hay varios componentes de terceros, algunos comerciales y otros free.

En Delphi 2010 se incluyen:

  • MSXML, de Microsoft que usa la Msxml.dll
  • Xerces, es una librería escrita en C++, que es parte del proyecto Apache.
  • ADOM, Alternative Dom, que es una nueva versión de OpenXML, escrita integramente en Delphi por lo que no depende de ninguna librería externa.

Todas ellas permiten crear Documentos XML, cargar un Documento XML desde un archivo, grabrlo a un archivo, recorrerlo, y hacer búsquedas.

Para entender como se trabaja con XML debemos conocer algunos conceptos primero:

  • Un Documento XML está formado por un conjunto de nodos, organizados jeráquicamente.
  • Un nodo tiene una etiqueta o tag, puede tener atributos, y puede tener un contenido.
  • Un nodo esta limitado por una etiqueta de inicio y una de fin.
  • Un Docuemento XML tiene un solo nodo raíz, a partir del cual se arma toda la jerarquía.

Por ejemplo si el pedazo de código de líneas arriba es un documento XML entonces diriamos que:

<libros>

Es el nodo raíz, este nodo tiene una etiqueta de inicio que es “<libros>” y una etiqueta de fin que es “</libros>”

  <libro tipo="novela">

Este nodo tiene por etiqueta o tag <libro> , vemos que además tiene un atributo llamado tipo y cuyo valor es novela.

Finalmente en el siguiente nodo:

  <nombre>La casa verde</nombre>

Es un nodo de tag <nombre> y que tiene un contenido que es “La casa verde”.

Ya me cansé por hoy así que acá lo dejo.

En la siguiente entrada veremos código de como se maneja XML en Delphi.

Delphi y Bases de Datos

Delphi ha sido tradicionalmente una herramienta excepional para trabajo con bases de datos, su propio nombre fué elejido como la herramienta para trabajar con Oracle (The Oracle at Delphi), de esto yá hace muchísmos años.

A lo largo del tiempo la forma en que Delphi trabaja con Bases de Datos ha ido variando.  La tecnología que Delphi promueve actualmente para su uso en desarrollo es DBX (dbExpress). Sin embargo no es la única ya que también soporta componentes de conexión nativos (conexiones directas a la BD o usando el protocolo nativo de la BD), ODBC y ADO.

Desde la época de Borland, Delphi viene con Interbase siendo esta la BD por default.  Interbase tiene en Firebird a su vástago OpenSpurce. Interbase/Firebird es una BD madura de nivel comercial que lleva varios años de delantera sobre muchas BD usadas en la actualidad (incluídos mySql, Postgres).

Delphi puede usarse con una amplia variedad de Bases de Datos comerciales y libres que se usan en la actualidad por ejemplo:

Además existen motores de bases de datos embebidos (incrustados) que pueden usarse con Delphi. Esotos motores pueden usarse para replicación local en aplicaciones Cliente/Servidor, para almacenamiento temporal, o cuando se requiera aplicaciones autocontenidas sin dependencias externas. Entre los más conocidos tenemos:

  • SQLite , usando la dll propia de SQLLite, existe tambien ports completos a Delphi
  • NexusDB, compila directamente en el EXE.
  • elevatedb,  compila directamente en el EXE.
  • Absolute Database, compila directamente en el EXE.
  • Firebird, usando una dll.
  • Accuracer Database,  compila directamente en el EXE.

Otra forma de manejar datos es usando tablas en memoria (Memory tables), muy útil para datos temporales:

Como se ve Delphi posee un arsenal muy completo para atacar el desarrollo de aplicaciones de Base de Datos, tal es así que algunas herrmientas para BD están desarrollados en Delphi, por ejemplo:

Una mirada a Delphi 2010

Aún no he usado mucho Delphi 2010 pero se ve bastante bueno y más sólido que las últimas versiones , bueno teniedo en cuenta que la versión que uso en el día a día es el venerable Delphi 7!!!!

Cosas interesantes (con respecto a Delphi 7, muchas de estas cosas ya habian creo que desde la 2005) son por ejemplo:

  • Agrupamiento de las unidades según el directorio donde se encuentran.  Fundamental para nosotros ya que manejamos diversos directorios.
  • La disstribución de las ventanas es algo a lo me tendré que acostumbrar, por que preferia las ventans flotantes de Delphi 7.
  • Hay una opción de debug para crear tus propios visores de variables, esto esta SUPER!!! y lo vamos a usar bastante.
  • La parte de modelamiento parece que ya está más pulida.
  • IDE Insigth, es un buscador dentro del IDE que encuentra de todo!!!, se ve prometedor.
  • El parser de XML que usabamos (OpenXML) viene incluído, más adelante haré un post sobre este tema.
  • El OTA es ahora mucho más abierto, ya sueño con mis propios diseñadores, visualizadores y herramientas para aligerarnos el trabajo.
  • El RTTI ha sido extendido, ahora no sólo se pueden ver las propiedades published, si no prácticamente todo, mmm podemos usarlo.
  • Ahora que Embarcadero soporta Firebird, puedo ver mistablas desde la IDE.
  • Soporte para Generics y Argumentos, Closures y otras cosas que todavia tengo que ver como sacarles provecho ya que requieren un cambio en la concepcion mental de las cosas.
  • El Help está mejor que en versiones previas en las que no había nada!

Finalmente una imágen vale más que mil palabras….

y paso 2009 y ya casi pasa el 2010

Jaja no escribo nada desde el 2008, y claro y es que nadie me lee jiji.

Bueno para que quede registrado mi último post fue en espera al Delphi 2009 (a.k.a. Tiburón). Finalmente ya salió el Delphi 2010.

Ahora estoy haciendo pruebas de migración a Delphi 2010 y mis pesadillas con esta nueva versión ppor el soporte de Unicode, poco a poco se han ido desvaneciendo.

Sin embargo aún no esta todo dicho, y sin embargo so far so good.

Mi principal pesadilla era la migración de los componentes que usamos, la mayoria tiene versión para 2010, y los otros han compilado casi sin despeinarse. Despues de haber leido tantos blogs con historias de terror sobre la materia, parece que no hay mucho.

La verdad de la milanesa aún esta por descubrirse, por que el que compile no es seguridad de que corra…., pero primero que compile por lo menos.

Para el manejo del protocolo y nuestro framework de persistencia de objetos, creo que la cosa está peluda, ya que usamos mucho char y arimética de punteros. Tenemos que analizar como vamos a manejar nuestra premisa de usar el mínimo espacio posible en el protocolo, ahi vislumbro problemas en el horizonte.