Introducción al lenguaje XML

Publicado el 22 agosto 2014 por Jamesrevelo @herprogramacion
Este articulo tiene como fin abarcar las características principales sobre el lenguaje XML. Con el fin de comprender el contenido de los archivos de recurso de un proyecto de desarrollo en Android. Veremos que es el lenguaje XML, por que surge como herramienta de interoperabilidad, cuales son sus usos y cual es la sintaxis para crear un documento XML.

¿Qué es XML?

Sus siglas significan eXtensible Markup Language, que en español es Lenguaje de Marcado Extendible. Es un lenguaje basado en etiquetas descriptivas, cuyo fin es representar información de texto en forma jerárquica, y a su vez darle formato. XML cobra importancia al surgir la necesidad de interoperabilidad entre dos sistemas de información, ya que propone un puente de intercambio entre dos fuentes de datos distintas.

¿Por qué crearon XML?

Inicialmente se originó para manejar y estructurar opciones de configuración para sistemas operativos o aplicaciones. Pero luego se elige para intercambiar información entre distintas tecnologías, debido a que establece un solo formato para obtener datos. Esto facilita importar y exportar información.
XML propone una sintaxis cómoda para las maquinas y los humanos, siendo un lenguaje afable para la construcción de estructuras complejas.

¿Qué ventajas tiene usar XML?

Aunque XML al principio no pretendió ser lo que es ahora, podemos encontrar excelentes cualidades en el uso de esta tecnología, entre ellas tenemos:
  • Independencia de datos y forma: Con XML puedes establecer la estructura de la información y al mismo tiempo separar la forma en que se interpretará dependiendo el contexto. Significa que si tienes un entorno A y un entorno B que usaran los datos de un archivo XML, solo defines los datos y cambias su forma dependiendo de cada contexto.
  • Extensibilidad: En cualquier momento puedes agregar nuevos componentes y atributos a un archivo XML.
  • Representación jerárquica: XML permite expresar anidaciones entre componentes. Lo que permite establecer un comportamiento de nodos padre e hijo. 
  • Interoperabilidad: Esta característica es mortal en XML. Es lo máximo. Ya que permite intercambiar información entre aplicaciones, módulos o sistemas sin importar la arquitectura o tecnología usada.

¿Los documentos XML se compilan o algo?

Estos archivos se analizan e interpretan por una herramienta llamada Parser(Analizador de sintaxis). Su objetivo es leer los elementos en el documento. Para ello interpreta su jerarquía y aplica el formato establecido para cada dato. Los parsers nos ayudan a obtener la información de un documento XML de forma automatizada en un contexto.
Puedes encontrar Parsers en las librería "System.Xml.XmlDocument" de .NET C#. Java también posee su propia librería estándar para parsear llamada Java built-in parser. También existen otros como Saxon, Xerces, y muchos mas.
En los navegadores como Google Chrome también implementan Parsers para convertir el contenido de un archivo XML a texto con formato HTML.

Amigo quiero escribir un documento XML, vamos a la acción!

OK, comencemos a estudiar las partes que conforman un documento XML y que sintaxis debemos usar.

Prólogo

El prólogo es una declaración XML no obligatoria que especifica algunas características del documento, como por ejemplo la versión de XML que se usa o el tipo de encriptado. El estilo de declaración sería como la siguiente línea:
<?xml version="1.0" encoding="utf-8"?>Esta expresión usa como inicio la palabra reservada "xml" y un signo de interrogación de apertura "?". El atributo version hace referencia al estándar XML usado y enconding indica el estándar de encriptado. Recuerda que el encriptado es la forma de traducir los caracteres que hay en el documento en forma binaria.
Existen varias formas de encriptado, pero normalmente el estándar usado es UNICODE. Los formatos mas populares son el UTF-8 y UTF-16. El primer formato representa cada carácter con 8 bytes y el segundo con 16 bytes.

Comentarios

Para usar comentarios abrimos con la expresión "<!--" y cerramos con los caracteres "-->" . Todo el texto que este comprendido entre estos símbolos será ignorado por el Parser. Veamos un ejemplo:
<!-- Este es un comentario en un documento XML por hermosaprogramacion -->
Los comentarios son mensajes destinados al entendimiento del código por parte del programador. Solo tiene fin informativo, así que serán pasados por alto a la hora del análisis XML.

Elementos

También llamados Building Blocks. Son la base de un documento XML, ya que al fin y al cabo ellos representan nuestra información. Al igual que en HTML, un elemento será descrito por una etiqueta inicial envuelta en paréntesis angulares <elemento> y una etiqueta de cierre con una barra inclinada antecedida al nombre del elemento </elemento>. Y al texto que se encuentra en el interior del elemento se le llama contenido.
Por ejemplo, declaremos un elemento llamado tabla:
<tabla>[contenido]</tabla>
En casos donde el elemento no describe algún contenido podemos abreviar la etiqueta de la siguiente forma:
<tabla/>
Con esta disposición reducimos a una sola expresión la apertura y cierre de un bloque de construcción XML.

¿Que debo tener en cuenta para nombrar un elemento XML?

Como en todas las gramáticas de los lenguajes computacionales hay restricciones para declarar etiquetas de elementos, en XML no es la excepción. Estas son las reglas que debes tener en cuenta cuando vayas a declarar el nombre de un elemento:
  • Puede comenzar con un guión bajo "_", una letra mayúscula o una letra minúscula del código.
  • Puedes usar guiones ‘-‘ dentro del nombre de un elemento. Además puedes incluir dígitos dentro de tu nombre.
  • Las etiquetas son sensibles a mayúsculas y minúsculas. Procura abrir y cerrar un elemento con el mismo nombre.
  • Nunca, por lo que más quieras uses espacios los nombres, esto producirá un error de Parsing.
  • La palabra xml no puede ser usada en el inicio del nombre del elemento, ya que está reservada.
Algunos ejemplos de buenos nombres serian:
<AutoDeCarrera><_cliente><estados-de-resultados><archivos1001>

El elemento Raíz

Luego de haber declarado el prologo sigue el elemento raíz (root element). Este componente representa la cabeza de la jerarquía estructural del archivo XML. Solo debe existir únicamente un elemento raíz que describa el contexto.
Veamos un ejemplo de un documento XML que guarda la información sobre facturas de un establecimiento comercial:
<fila id_factura="1001" fecha="20/12/2014 12:01:23 "/>
<fila id_factura="1002" fecha="21/12/2014 07:23:29 "/>
<fila id_factura="1003" fecha="22/12/2014 14:34:10 "/>En este caso el Parser no procesará correctamente la información debido a que cada nodo <fila> esta al mismo nivel, por lo tanto no hay jerarquía. Es por eso que decides añadir un elemento raíz que encierre el contenido llamado <factura>:
<factura>
     <fila id_factura="1001" fecha="20/12/2014 12:01:23 "/>
     <fila id_factura="1002" fecha="21/12/2014 07:23:29 "/>
     <fila id_factura="1003" fecha="22/12/2014 14:34:10 "/>
</factura>Con este detalle el parser ya puede comprender que esta sucediendo en el modelo del documento.

Elementos hijos

Luego de declarar tu raíz siguen los elementos que están por debajo. En el caso anterior, <fila> era un elemento hijo de <factura>. Y los tres elemento fila estaban al mismo nivel, por lo tanto eran hermanos. Es posible anidar un elemento dentro de otro, recuerda que estamos siguiendo una jerarquía, así que cada elemento interior estará bajo la dependencia de su padre.

¿Qué son los atributos?

Son propiedades que caracterizan a los elementos. En el caso anterior <fila> tenía como atributos a id_factura y fecha. Ambos representan datos relacionados a un elemento fila, que describen sus funciones informativas.
Al igual que los elementos, los atributos tienen reglas para ser definidos:
  • Los atributos deben contener un nombre y un valor de texto expresado a través del signo de igualdad "=".
  • El valor debe estar contenido entre comillas simples o dobles. Ambas cumplen la misma función, pero la elección depende de cada quien.
  • Los nombres de los atributos cumplen exactamente las mismas reglas de la construcción de nombres para elementos.
  • Si un atributo no tiene valor establecido debes poner un vació entre comillas (" " ó ' ').
  • No deben haber nombres de atributos repetidos dentro de un elemento. Cada nombre ha de ser único.
  • Si deseas que el valor del atributo tenga comillas simples o dobles, establece como limitador a par de comillas que no serán usadas. Es decir,  si deseas que tu atributo tenga el valor "1234", entonces debes delimitarlo con las comillas simples: ' "1234" '.

Contenido de elementos

El contenido de los elementos permite describir el texto al cual se le dará formato. El contenido lo expresas entre las etiquetas de apertura y cierra como vemos a continuación:
<frase>Ejemplo de contenido de un elemento</frase>
A la hora de establecer el texto en el contenido de un atributo o un elemento no podemos usar algunos caracteres que están restringidos. Esto se debe a que son usados por la sintaxis XML y si el Parser llega a encontrar uno de estos elementos, tenderá a confundirse y a generar errores de análisis.
Para solucionar este problema existen comodines dentro del estándar XML que representan estos caracteres. Veamos una tabla ilustrativa:

Carácter Representación

& &amp;

< <

> >

“ &quot;

‘ &apos;


De modo que si deseas emplear alguno de estos símbolos, debes reemplazarlo por la expresión que lo representa.

¿Cuándo uso atributos o elementos?

Esta es una gran pregunta, ya que parece ser confusa la manera en ubicar la información dentro de un archivo XML.
Usaremos atributos cuando la información no se repita y además no requiere orden lógico. Veamos el siguiente ejemplo sobre los datos de un estudiante:
<estudiante nombre="Carlos" apellido="Clavijo" teléfono="2230012"/>
En este caso la información es básica y atómica, no es necesario que extendamos a nuevos elementos. Si añadimos nuevos elementos disminuiria la velocidad de parsing . Usa elementos nuevos solo cuando sea estrictamente necesario.
Supongamos que deseamos representar las materias que está viendo el estudiante. Por ello incluimos un nuevo atributo llamado materias:
<estudiante nombre="Carlos" apellido="Clavijo" teléfono="2230012"
materias="calculo, física mecánica, algoritmia, estadística"/>
Si se necesitara procesar cada materia individualmente, ¿crees que seria útil la estructura actual del formato XML?
¡Claro que no!...ya que el valor de materias es solo una cadena, lo que implicaría un proceso adicional de procesamiento de cadenas en nuestro contexto. Pero si usáramos elementos en vez de ese atributo tendríamos lo siguiente:
<estudiante nombre="Carlos" apellido="Clavijo" teléfono="2230012">
     <materia nombre="calculo" />
     <materia nombre="física"/>
     <materia nombre="mecánica"/>
     <materia nombre="algoritmia"/>
     <materia nombre="estadística"/>
</estudiante>
Con esta jerarquía podemos identificar de manera secuencial cada elemento materia para conseguir procesar la información en orden .

Muchas veces he visto que usan CDATA en los documentos XML, ¿Qué significa?

CDATA (character data) es una sección especial en un archivo XML, que le indica al Parser que no interprete como lenguaje marcado todo lo que se encuentre adentro. Para los que han usado Blogger de Google, sabrán que la plantilla XML de la cual se crea el documento HTML del blog usa esta sección.
Es comun usar esta sección para incluir código CSS o Javascript, para que el Parser no lo interprete como marcado, debido a que usan frecuentemente los caracteres de escape restrigindos ('&', '<', '>',...).
La sección CDATA se inicia y termina de la siguiente forma:
<![CDATA[
[Contenido no interpretable como marcado]
]]>
Después de que el Parser haya analizado el documento XML, todo el texto en las secciones CDATA habrá quedado intacto.

¿Qué son namespaces?

Son una forma de agrupar atributos o elementos bajo un mismo encabezado para diferenciarlos de otros. Esto permite contextualizar los bloques de tal forma que sean distinguidos en situaciones diferentes.
Puedes asemejarlo con los namespaces de C++ o los paquetes de Java. Dentro de estos espacios son referenciados objetos de información que solo conciernen a este nombre de espacio. Lo cual permite diferenciar el uso de la información.
Veamos el siguiente ejemplo:
<biblioteca>
     <libro >
          <titulo>Fundamentos de programación</titulo>
          <paginas>213</paginas>
          <capitulo>
               <titulo>Introducción</titulo>
          </capitulo>
     </libro>
</biblioteca>
Este documento describe los libros que se encuentran en una biblioteca. Como ves, la etiqueta <biblioteca> es el nodo principal, en su interior está la etiqueta <libro> y dentro de él empezamos a definir componentes que hacen parte de la estructura de un libro como el titulo, las páginas y los capítulos.
¿Qué notas?...¡exacto!, el libro tiene una etiqueta <titulo> para referirse al nombre del libro, y a su vez cada capítulo tiene una etiqueta <titulo> para referirse al nombre del capítulo. Cualquier persona puede entender esta ambigüedad debido a que es una representación visual y estructural, pero…. ¿podemos decir lo mismo de Parser?
Esta situación haría que el parser se confundiera y provocará malos resultados cuando busquemos información. El parser se preguntaría:
El elemento <libro> es padre de <capitulo>, pero ambos tienen como hijo a <titulo>, ¿que sucede?

Justamente en este tipo de situaciones contextuales es donde intervienen los namespaces.

¿Cómo defino un namespace?

Bueno, antes de definirlos debemos conocer primero que son URLs, URIs y URNs.
Uniform Resource Locator (URL): Es un formato que permite obtener recursos de alguna ubicación. Popularmente conocemos este concepto debido a que frecuentemente buscamos páginas web en internet con ellas. A continuación vemos su estructura:
[Esquema]://[Dominio]:[Puerto]/[Ruta]?[Query]#[Id]
Podemos tomar el ejemplo de URL de este sitio:
http://hermosaprogramacion.blogspot.com
Aunque no usa todo el formato, podemos identificar que el esquema usado es HTTP y el dominio seria "blogspot"(con subdominio "hermospramacion").
Uniform Resource Identifier(URI): Es solo una cadena única que representa algo y puede tener el formato de las URLs y URNs.
Uniform Resource Name(URN): Es un nombre que identifica algún objeto para diferenciarlo de los demás. Normalmente tienen el siguiente formato:
urn:[identificador del namespace]:[cadena especifica del namespace]
El ISBN de un libro puede representarse a través de un esquema URN. Por ejemplo:
Urn:ISBN:9098231847381
Las URLs y URNs pueden ser URIs. Una URL muestra la ruta única de un recurso y una URN un nombre único. Ambas pueden representar una URI que posibilite la creación de namespaces en nuestros archivos XML.

¿Cómo crear un namespace?

Para crear un namespace primero debemos elegir una URI que nos permite diferenciar su contexto. Por lo general se usa un formato URL ya que el dominio de cada compañía es unico, lo que asegura una identificación que no se repetirá. Cabe destacar que aunque la URI tenga un formato URL no significa que la URI sea una URL.
Para mi caso en particular usaré la siguiente URI:
"http://hermosaprogramacion.blogspot.com/namespaces/ejemplos/noEjemplo"
Hay dos formas de relacionar un elemento a un namespace. En la primera  simplemente debemos asignar a los elementos que deseemos dentro del documento la URI para que se incorpore al namespace. La forma de establecerla es a través de la palabra reservada "xmlns" y luego asignarle el valor de la URI. Es muy similar a la declaración de un atributo dentro de un componente.
xmlns="URI"

¿Puedes mostrar algún ejemplo?

¡Claro!, veamos un caso hipotético donde supondremos que necesitamos dar formato a los valores actuales de pares de divisas más populares del Foreign Exchange.
<forex fecha-actual="19/08/2014"
xmlns=" http://hermosaprogramacion.blogspot.com/namespaces/ejemplos/no1">
     <par nombre="EURUSD" current="1.323"/>
     <par nombre="EURGPB" current="1.845"/>
     <par nombre="AUDUSD" current="0.8976"/>
</forex>
Como ves, hemos declarado la URI en el nodo raíz. Esto significa que todos los componentes dentro del elemento también harán parte del namespace identificado con la URI establecida. Este estilo de declaración se le llama namespace implícito o por defecto.
La otra forma se le llama declaración explícita. Haremos exactamente lo mismo que en la forma implícita solo que esta vez seleccionamos que elementos específicos queremos que hagan parte del namespace, a través un sistema de etiquetado.
Veamos:
<FX:forex fecha-actual="19/08/2014"
xmlns:FX=" http://hermosaprogramacion.blogspot.com/namespaces/ejemplos/no1">
     <par nombre="EURUSD" current="1.323"/>
     <par nombre="EURGPB" current="1.845"/>
     <par nombre="AUDUSD" current="0.8976"/>
</FX:forex>
Si prestas atención, hemos usado la etiqueta "FX" en la declaración de la URI del namespace. Puedes poner el nombre que deseas y anteponer dos puntos ":" para hacer efectiva su declaración. Al usarse se usan los dos puntos delante de ella como vemos en el inicio de las etiquetas de apertura y cierra de la etiqueta <forex>.
Este nombre permite personalizar la declaración de los elementos que pertenecerán al namespace además del acceso hacia ellos.
Apliquemos este concepto de namespaces al ejemplo de la biblioteca que puede llegar a tener problemas.
<b:biblioteca
xmlns:b="http://hermosaprogramacion.blogspot.com/namespaces/ejemplos/no2">
     <b:libro >
          <b:titulo>Fundamentos de programación</b:titulo>
          <b:paginas>213</b:paginas>
          <capitulo xmls="http://hermosaprogramacion.blogspot.com/namespaces/ejemplos/no2-capitulo">
               <titulo>Introducción</titulo>
          </capitulo>
     </b:libro>
</b:biblioteca>
Ahora ya podemos diferenciar ambas etiquetas <titulo>, ya que ambas pertenecen a namespaces diferentes. El primero lo declaramos explicito para definir todos los elementos que obedecerán a la etiqueta "b" y el segundo fue implícito en el elemento interior capitulo.
Así cuando el parser analice este documento entenderá que:
{http://hermosaprogramacion.blogspot.com/namespaces/ejemplos/no2}titulo
y
{http://hermosaprogramacion.blogspot.com/namespaces/ejemplos/no2-capitulo}titulo
son dos elementos totalmente distintos.

¿Es posible obtener datos de un archivo XML externo?

Por supuesto!, para extraer información de un archivo XML debemos usar el lenguaje XPath. Este lenguaje permite navegar a través de la estructura jerárquica de documentos que implementen el Document Object Model(DOM). Pero en esta ocasión no entraremos en detalle sobre este tema, queda en tus manos comprender el acceso a documentos con jerarquías.
Si has visto en los archivos layout XML de Android Studio, es muy frecuente que se pida el valor de los nodos <string> de esta forma:
"android:text="@string/name""
Esa sentencia nos indica que el atributo texto de las vistas se encontrará almacenado en el archivo strings.xml que tenga el nombre "name".
Como notas, XPath funciona con un estilo de navegación a través de barras laterales y expresiones regulares para encontrar el elemento que necesitamos .

¿Te ha gustado este artículo?

Suscribete y compártelo con los mas necesitadosJames Revelo Urrea - Desarrollador independiente