Guía de migración y actualización a
 Visual Basic .NET

Conozca en su propio idioma todo lo que la plataforma .NET y VB tienen para Usted

Guía de migración y actualización a VB .Net 

 

Introducción a XML (Erich Bühler, www.vblibros.com. Publicado en revista Sólo programadores, febrero 2004)
Fuentes clic aquí

Nunca voy a olvidar cuando hace unos años atrás escuché por primera vez la sigla XML. Lo primero que pensé fue en una nueva tecnología de la mega empresa Microsoft y la verdad es que  tenía algo de base personal en esta teoría, ya que recientemente la compañía comenzaba a emplear 3 y hasta 4 letras para denominar a sus funcionalidades, a diferencia de las dos a las que estaba acostumbrado. Era posible en ese entonces encontrar siglas tan divertidas como SOAP (jabón en inglés), ROPE (cuerda en inglés), y XML que se parecía más a una medida de ropa extra media grande que a una tecnología interesante.

Pero antes de hablar sobre XML vamos a hacer un poco de historia para conocer sus orígenes así como su importancia dentro del mundo informático.

 

Hagamos un poco de historia sobre XML…

XML proviene de un lenguaje que inventó IBM en los años 70 llamado GML (lenguaje de marcación general en inglés), que surgió debido la necesidad que tenía la empresa de almacenar grandes cantidades de información sobre temas diversos.  Piense por un momento en la cantidad de documentación que generaba IBM sobre todas las áreas en las que trabajaba e investigaba y la cantidad de información que habrá generado hasta el presente. Fue así que los expertos diseñaron un conjunto de pautas a seguir para clasificar y almacenar todo tipo de datos y documentos, con el fin de que posteriormente se pudiesen procesar adecuadamente. Este lenguaje fue muy bienvenido por la gente de ISO que es una entidad que se encarga de normalizar cuantas cosas se puedan imaginar sobre los procesos del mundo actual, de modo que en el año 1986 trabajaron para normalizar este conjunto de normas creando así el meta-lenguaje SGML, que no era más que el GML estandarizado.

SGML constituye un extenso y complejo conjunto de reglas que brindan la posibilidad de construir y organizar información en un simple documento de texto. Como consecuencia en el año 1989 un científico Londinense de los laboratorios de la Organización europea para la investigación nuclear (CERN) en Génova llamado Tim Berners-Lee –y posterior fundador de la W3C- creó HTML utilizando alguno de los conceptos de SGML. En este caso se perseguía el fin de almacenar información así como también el tipo de formato que tendrían los datos y todo esto utilizando un solo documento. Esto permitía transferir un archivo y que este no sólo hiciese referencia a información sino que también a como se debían mostrar finalmente los datos, o lo que es igual, su formato (tipos de letras, hipervínculos, etc.). Se comenzó también con la definición de un tipo de documentos mucho más sencillo que SGML con el fin de poder ser utilizado para almacenar información de forma estándar y estructurada, pero aquí no se deseaba contener nada sobre la presentación de los datos como era el caso de HTML.

El resultado fue XML (Lenguaje de marcación extendida en inglés) el que era en realidad una simplificación de SGML y definía básicamente un conjunto de reglas sencillas a seguir para almacenar información de forma estructurada.

 

“Si el marketing no es lo suyo, entonces le alegrará saber que XML no es más que un archivo de texto con una estructura que sigue ciertas reglas”

Introducción a XML

Vamos a centrarnos en lo que realmente nos interesa. Como aprenderemos más adelante no es nada complejo construir o leer un documento XML, por lo que observemos primeramente un archivo de este tipo en el listado 1:

<?xml version="1.0" encoding='ISO-8859-1' ?>

<Clientes>

<Cliente>

                        <Identificador>11</Identificador>

                        <Nombre>Noel</Nombre>

                        <Apellido>Papá</Apellido>

                        <Dirección>Calle del Polo 4759/202</Dirección>

</Cliente>

</Clientes>

Listado 1.

Nota: Tenga en cuenta que siempre que se hace referencia a este tipo de formato se utiliza forzosamente el término de documento en vez de archivo.

Todo documento debe comenzar con la línea <?xml version="1.0" ?> o <?xml version="1.0" encoding='ISO-8859-1' ?> si se desean utilizar tildes en el documento. Por ahora existe solamente la versión 1.0 de Xml, por lo que este renglón es siempre constante. La etiqueta es el pilar fundamental y es la forma principal en la que se expresa la estructura del mismo y su contenido. Un elemento se formula siempre dentro de una etiqueta de comienzo y una de finalización.

            <Nombre></Nombre>

El nombre de la misma queda a discreción de quien crea al documento, aunque normalmente se hace referencia al dato que va a contener. La etiqueta debe ser incluida entre signos de mayor y menor y es necesario especificar el cierre del dato mediante una etiqueta de igual nombre que la primera, salvo que ella debe incluir en todos los casos una barra a continuación del carácter de menor.

            <Nombre>Juan</Nombre>

A su vez todo dato o valor debe ser contenido por esta entidad aunque también puede almacenar otras etiquetas, lo que se denomina anidado de elementos. Para que un documento sea sintácticamente correcto o ‘bien formado’ en la jerga XML, se deben cerrar las etiquetas en el mismo orden en que fueron abiertas. El listado 2 exhibe un ejemplo de un documento no válido o ‘mal formado’:

<Cliente>

            <Identificador>11
            <Nombre>Juan</Identificador></Nombre>

</Cliente>

 Listado 2.

Los nombres de las etiquetas no pueden comenzar con la palabra XML ya sea mayúscula o minúscula. Adicionalmente es posible utilizar las siguientes dos formas para indicar que un elemento carece de valor: 

            <Dirección> </Dirección>

            ó

            <Dirección/ >

Puede también asociar información adicional a una etiqueta haciendo uso de los atributos. Estos se incluyen siempre dentro de la marca de comienzo y se debe asignar al este un nombre clave y su respectiva información.

            <Dirección Tipo=’Edificio’ Número=’202’>Calle Almería 4759/202</Dirección>

El atributo es siempre un valor agregado y no existe una restricción de cantidad por elemento, ni tampoco una regla general de que datos deberían ser puestos en elementos y cuales en atributos, aunque por norma general el atributo debe ser siempre un valor adicional y no se debe abusar de esta característica ya que normalmente derivaría en una estructura poco clara. La tabla 1 muestra algunas funcionalidades adicionales que son factibles de utilizar en documentos XML.

 

Funcionalidad

Utilidad

Ejemplo

Comentario

Representar un comentario en el documento sin que ello afecte la estructura o se consideren datos del mismo.

<--! Es un comentario -->

<Cliene>Juan</Cliente>

Caracteres restringidos

Representar los caracteres que se utilizan en la construcción del documento sin por ello ser tomados con este significado.

<          &lt;
>          &gt;
”           &quot;

 

Etcétera

Etiquetas de control

Indicar a quien procese el documento información adicional  sin que la misma sea una parte formal de la estructura de datos del documento. Siempre comienza con <? Seguido del nombre.

<?AlProcesar EliminarLuegodeProcesar=’Si’ ?>
<Cliene>Juan</Cliente>

 Tabla 1. Resumen de tipos de elementos en XML.

Es posible  pensar que XML es algo demasiado tonto para la importancia que el mercado y muchas empresas le dan y hay mucho de razón en esto si solamente se piensa en el mismo como un formato para archivos de texto que deben seguir ciertas pautas. Sin embargo lo más importante es algo tan simple como que es texto con reglas estándares y esto hace que pueda ser almacenado en cualquier medio y transmitido a través redes diversas sin mayores problemas; y ni que hablar de las ventajas de compartir información entre diferentes sistemas operativos sin necesidad de utilizar formatos propietarios. De hecho yéndonos a temas más técnicos la infraestructura .NET o .NET framework como la suele llamar la gente de Microsoft hace uso extensivo de esta tecnología para todo lo que sea almacenamiento de información y comunicación con componentes remotos a través de Internet. Digamos entonces que la importancia es más de las tecnologías colindantes que del propio XML, aunque sea este último el que esté finalmente contribuyendo a la solución final. Antes de seguir veamos alguna de las tecnologías donde se utiliza XML:

 

Esquemas XML y DTD

Fue creada por Microsoft hace ya un tiempo atrás y utiliza para su conformación sintaxis XML. Esencialmente un esquema XML describe y define la estructura y tipos que deberá contener otro documento XML. Adicionalmente se ofrecen aplicaciones llamadas validadores sintácticos que leen el documento XML de esquema y verifican que el archivo XML con los datos contenga la estructura, tipos y orden esperado. Esto es de mucha utilidad cuando se desea por ejemplo verificar si un documento XML creado sigue las pautas acordadas. Es posible ver esta utilidad en empresas que reciben de otra información en formato XML y necesitan en todo momento validar que se cumpla con las estructuras pre-acordadas. La figura 1 muestra este proceso:

 

Figura 1.Validación de documentos XML

La tecnología de DTD es similar a la de esquema XML pero a diferencia es más antigua por lo que ofrece menores funcionalidades, y no utiliza XML para su notación. De hecho, existen aplicaciones capaces de convertir un documento DTD en uno de esquema XML.

 

Serialización XML

La serialización es in proceso muy importante en las nuevas tecnologías, ya que hace posible que muchas de las innovadoras características funcionen y por supuesto abre el abanico a nuevas soluciones y posibilidades. La misma brinda que el estado de un objeto pueda ser convertido a un documento XML para ser recuperado más tarde. Esto es, leer los valores de sus propiedades y escribirlas a un archivo con formato XML. En algún momento de la historia de la aplicación se creará un nuevo objeto y se aplicará el documento al mismo. Esto dará como resultado un nuevo objeto idéntico al inicial. Las utilidades son infinitas ya que es posible recuperar el estado que tenía un integrante de la aplicación más tarde, guardarlo en una base de datos, o enviar los mismos a través de la red para que otro miembro lo obtenga y por ende recree el objeto, su estado y posteriormente acceda a éste. Pero… ¿Qué otra utilidad tiene la serialización?

Seguramente haya visto en algún momento la serie televisiva Star Trek, bueno… si no la vio a ciencia cierta sepa de qué se trata. Imagínese que necesita transferirse de un punto de la galaxia a otro que está a millones de años luz, normalmente no elegirá hacer uso de los medios tradicionales sino que optará por algo mucho más rápido como es la tele-transportación. A mi me gusta mucho ya que puedo trasladarme de un sitio a otro en segundos sin importar la distancia y hasta sumo puntos que puedo luego canjear por descuentos en comercios y futuras tele-trasportaciones. La idea es sencilla, simplemente me introduzco dentro de una especie de tubo con puerta y luego marco las coordenadas espaciales hacia donde quiero dirigirme. Si todo sale bien en cuestión de segundos estoy allí. ¿Cómo se lleva esto acabo?

 

Figura 2. Serialización XML

Mi persona es dividida en trozos y enviada en orden a través de éter, o también podría ser adicionada información de como ensamblar las partes correctamente. Lógicamente esto daría como resultado final a mi persona tal cual era originalmente. De omitirse esta última información quedaría en destino al buen estilo de Salvador Dalí.

Si bien Microsoft no puede todavía tele-transportar personas, si puede hacerlo dentro del mundo .NET framework. Dentro de la jerga de la infraestructura .NET al proceso de tele-transportación se lo denomina serialización XML, y es la clave de muchas de las tecnologías como, ser Servicios Web XML, objetos DataReader con información, etc.

Durante el proceso básicamente se cuenta con un objeto con valores en sus propiedades y se leen y configuran los mismos a un documento XML. Estos son posteriormente enviados a través de la red (por ejemplo Internet) con el fin de que sean recepcionados por alguien en algún punto. Automáticamente en destino la infraestructura .NET leerá el documento y recuperará el estado del objeto, pudiéndose posteriormente acceder a este de forma normal.

 

Servicios Web XML

Un servicio Web es un componente con métodos (procedimientos y funciones) que pueden ser invocados por una aplicación. A diferencia con uno tradicional en donde éste se sitúa localmente y el proceso de ejecución es normalmente el mismo computador, para ejecutar un servicio Web es necesario atravesar una red (Internet, Intranet, etc.) para ejecutar al mismo. En esta tecnología utiliza también XML y serialización, tanto para la comunicación con el servicio como en el pasaje de parámetros y la vuelta de los valores resultantes.

Lo sano y positivo es que como todo resulta estándar la comunicación puede ser llevada adelante entre diferentes lenguajes y sistemas operativos sin mayores inconvenientes.

 

 

Figura 3. Servicio Web XML

 

XPATH, XQUERY

Esta tecnología hace posible efectuar consultas sobre un documento XML con el fin de obtener los nodos que cumplan con la condición determinada. Si bien existen diferencias conceptuales entre ambos, no nos extenderemos en este tema debido a que tenemos todavía mucho por aprender. Veremos un ejemplo de XPath más adelante.

 

XSD

Visual Studio .NET tiene la capacidad de analizar la estructura de una base de datos (tablas, campos, relaciones, etc.) y plasmar a esta en un documento de esquema XML llamado XSD. Esta funcionalidad se utiliza para conocer la constitución de un modelo de datos cuando no se tiene acceso al mismo. Un desarrollador o empresa que tenga un documento XSD basado en una base de datos podrá conocer todo sobre ella sin tener que acceder a la misma. Existen productos tales como el generador de informes Crystal Reports que pueden elaborar un reporte sin necesidad de conectarse a la base de datos, tan sólo leyendo el documento de Esquema de datos XML.

 

XSLT

XML es muy bueno para describir información pero si se desea mostrar no es muy agradable a la vista. Para subsanar esto se cuenta con XSLT que es un documento XML que contiene información sobre una o más transformaciones de estilo que se desean aplicar a un documento XML. Para ello se requiere un programa llamado ‘parser’ o motor que es quien interpreta las transformaciones que se deben llevar adelante en el documento. El resultado final podría ser cualquier tipo de documento de texto (rtf, html, etc); véa la figura 4.

 

Figura 4.Transformación utilizando XSLT

 

¿Es necesario conocer XML para utilizar estas tecnologías?

Esta es una pregunta muy frecuente y la respuesta es que no. Es posible utilizar servicios Web XML, esquemas XML, XSD, etc. sin saber lo más mínimo del metalenguaje de marcación extendida, sin embargo el comprender su funcionamiento le permitirá un mayor dominio sobre las tecnologías, cosa que a los programadores nos interesa de particular interés. Sin embargo vamos a centrarnos en la parte programática, esto es, acceder y gestionar documentos utilizando .NET framework.


Microsoft, .NET y los documentos XML

Una de las tareas más frecuentes en el mundo informático es acceder a un documento XML para obtener su información.  Existen varias formas en .NET para hacer esto, y cada una de ellas ofrece un conjunto de ventajas y desventajas, algunas de ellas procuran consumir el menor número de recursos, mientras que otras apuntan a obtener la mejor velocidad de procesamiento. Sin perjuicio de ello todas las funcionalidades se pueden localizar en la biblioteca de clases dentro del espacio de nombres System.XML.

“Las clases para gestión de documentos XML
están en el espacio de nombres System.XML”
 


XML DOM

La primera tecnología que Microsoft presentó al mercado para acceder a documentos XML se llamó Modelo de documentos de objetos XML o DOM, y actualmente tiene bastantes adeptos sobre todo porque es posible usar la biblioteca en forma gratuita e integrarla con cualquier lenguaje. Esta tecnología ve a un documento XML como una estructura jerárquica de nodos, de forma similar a lo que es un árbol de directorios. Cada etiqueta es aquí un nodo y los nodos contenidos dentro de este es considerado un sub-nodo.

La navegación se realiza de forma jerárquica a través de una estructura de árbol conformada por los diferentes miembros. Para acceder a un nodo se debe acceder primero al que está por encima de él y luego ir bajando por la jerarquía hasta llegar al deseado. Esto si bien logra que puedan ser aplicados conceptos tan de moda como ser la recursividad y las colecciones, en realidad hace que la mayor parte de los desarrolladores se sientan frustrados por no comprender bien el modelo de acceso. A su vez esta tecnología debe cargar siempre la totalidad del documento en memoria para poder realizar la estructura, lo que puede dar como resultado un consumo abusivo de memoria si el documento es muy extenso.

 

Figura 5. Documeno XML en MS DOM

 

Todo documento XML bajo este modelo está representado por una clase denominada XMLDataDocument y el primer paso reside siempre en definir una variable de este tipo a los efectos de poder cargar al mismo.

 XmlDataDocument MiDocumento = new XmlDataDocument();

 Nota: Recuerde incluir using System.Xml; al comienzo de cada módulo, con el fin de importar este espacio de nombres.

Un documento puede ser cargado desde un archivo, una URL, o una variable de texto. Para este fin XMLDataDocument ofrece dos posibles métodos:

-         Load

-         LoadXML

El primero acepta entre otros la ruta y nombre de archivo o dirección URL, mientras que el segundo admite una variable conteniendo un texto con información en formato XML. Utilizaremos para los ejemplos de este artículo usaremos la primera opción.

MiDocumento.Load("Clientes.xml");

Al ejecutarse esta línea se carga el documento en memoria de forma completa y se organiza en una estructura jerárquica. El siguiente paso es siempre el mismo, lo que constituye en obtener una referencia al nodo raíz o elemento principal.

Existe otra dificultad adicional y es que en XML DOM existe una estructura de clase diferente para soportar a los distintos tipos de nodos del documento. No se utiliza la misma estructura si se desea obtener un elemento, un atributo, o un comentario. La tabla 2 muestra el resumen de estructuras de XML DOM en .NET Framework.

Clase

Descripción

XmlElement

Elemento del documento.

XmlAttribute

Atributo de un elemento.

XMLCDataSection

Sección que hace posible contener cualquier tipo de información, incluso con caracteres y notación reservada por XML.

XMLComment

Comentario.

XmlNode

Nodo de un documento (puede ser cualquiera de los anteriores)

 Tabla 2. Resumen de tipos de elementos en XML DOM.

Ahora que ya sabemos como se representan los elementos en XML DOM vamos a centrarnos en como escribir un fuente en C# que realice la navegación hasta un elemento determinado. Esto es aplicable a cualquier lenguaje pero lo haremos en este último visto que está de moda. Si presta atención al listado 3 notará que se hace uso de  InnerText, auque también existe InnerXML, y OuterXML. La diferencia es que el primero retorna el valor del nodo (elemento) y de los interiores excluyendo a las etiquetas, mientras que el segundo retorna el trozo de documento XML desde el punto en cuestión. Por su parte el último  obtiene lo mismo que el anterior salvo que incluye la etiqueta a la que se hace referencia.

XmlDataDocument MiDocumento = new XmlDataDocument();
XmlNode Raíz;
XmlNode Identificador;

//Carga el documento.
MiDocumento.Load("Clientes.xml");

//Se posiciona en el nodo Raíz.
Raíz = MiDocumento.DocumentElement;

//Va al primer nodo secundario del primer nodo.
Identificador = Raíz.FirstChild.FirstChild;

//El resultado es: 11
Console.WriteLine(Identificador.InnerText);

//El resultado es Noel.
Console.WriteLine(Identificador.NextSibling.InnerText);

//Retorna el contenido de todos los elementos por debajo de Cliente
Console.WriteLine(Identificador.ParentNode.InnerText);

 Listado 3. 

Los métodos de navegación utilizados se describen en la tabla 3.

Método

Descripción

FirstChild

Referencia al primer nodo secundario o hijo.

NextSibling

Referencia al nodo secundario o hijo.

ParentNode

Obtiene una referencia al nodo del nivel superior o nodo ‘padre’.

LastChild

Referencia al último nodo.

DocumentElement

Obtiene la referencia al nodo raíz del documento.

 Tabla 3. Resumen de métodos de navegación

Existe una alternativa que en algunos casos puede resultar de mayor provecho y es la posibilidad de utilizar XPATH. Básicamente esta tecnología hace posible efectuar una o más consultas sobre un documento XML para obtener como resultado el nodo o nodos que coincidan con el patrón especificado. Por ende el concepto es similar al de Consulta en una base de datos. Podría indicarse que se solamente se desean obtener los clientes en un rango determinado, o un cliente en particular. Veamos un ejemplo de esto:

 

//Referencia al cliente con el identificador indicado.

Identificador = Raíz.SelectSingleNode("//Cliente[Identificador=23]");

 

//Muestra todos los nodos de ese cliente

Console.WriteLine(Identificador.InnerText);

Listado 4.

Adición de nodos

Una tarea común es la de adicionar nodos a un documento, esto incluye también la creación total del documento desde cero. Para esta tarea es necesario crear el o los elementos para posteriormente indicar donde se desean adicionar a los mismos. El listado 5 exhibe la forma de agregar un nuevo nodo llamado TeléfonoMóvil dentro del nodo cliente.

 

XmlElement TeléfonoMóvil = MiDocumento.CreateElement("TeléfonoMóvil");
TeléfonoMóvil.InnerText="0303456";

//Va al primer nodo y luego al secundario de este (Cliente).
PrimerCliente = Raíz.FirstChild;

//Adiciona al nodo.
PrimerCliente.AppendChild(TeléfonoMóvil);                 

//Exhibe los elementos del cliente.
foreach (XmlNode Elemento in PrimerCliente)
{
      Console.WriteLine(Elemento.Name + ":" + Elemento.InnerText);
}

Listado 5. 

Por supuesto que al guardar el documento en un archivo automáticamente se creará la estructura con el nuevo nodo.

 

Una alternativa más sencilla…. El lector XML

Si no interesa la estructura jerárquica del documento y lo que quiere es acceder a un elemento o valor en particular existe una segunda alternativa llamada XmlTextReader. Esta a diferencia con XML DOM ofrece una vista plana y secuencial del documento como si se estuviese recorriéndose línea a línea (en realidad es esto lo que hace). Como beneficio no se no carga todo el documento sino que la línea en la que está situado. Sin embargo tiene algunas restricciones lógicas como ser que una vez en una línea no es posible ir a la anterior o que no se sabe con certeza que nodo es secundario de quien. Tampoco es posible modificar la información, por lo que los lectores solamente acceden a los datos de lectura. Veamos un ejemplo y su resultado en el listado 6:

XmlTextReader Lector = new XmlTextReader("Clientes.xml");                 

//Lee a todos los nodos línea a línea.
while (Lector.Read())
{
      Console.WriteLine("Contenido: " + Lector.Name + ", Tipo: " +
      Lector.NodeType.ToString() + ", Valor: " + Lector.Value);
}

 Listado 6.

Afortunadamente existe la alternativa de trasladar un lector XML a un buffer en memoria para ser interpretado jerárquicamente mediante XML DOM, lo que puede facilitar la tarea. También se cuenta con la posibilidad de integrar la tecnología ADO.NET mediante los llamados documentos de esquema de datos XML, pero eso será tema para un próximo artículo. No obstante si es curioso como yo le recomiendo vea en la documentación la clase XmlDataDocument para conocer más acerca de este tema.

Hasta aquí hemos aprendido como gestionar documentos XML utilizando .NET framework y en el próximo artículo nos centraremos en la serialización XML, tecnología que se aplica a gran parte de los aspectos de la infraestructura. Por supuesto que existen más métodos que no hemos cubierto, aunque comprendiendo el funcionamiento explicado no tendrá mayores dificultades en entender su forma de trabajo.

 

Nota de copyright: Todas las marcas y/o tecnologías aquí citadas, son marcas registradas de las respectivas empresas y/o dueños.

© 2004 InetWork
All right reserved