Capítulo Capítulo 3333: :: :...

22
3-. XML. - 19 - Capítulo Capítulo Capítulo Capítulo 3: : : : XML. XML. XML. XML.

Transcript of Capítulo Capítulo 3333: :: :...

3-. XML.

- 19 -

Capítulo Capítulo Capítulo Capítulo 3333: : : : XML.XML.XML.XML.

3-. XML.

- 21 -

3. XML.

Puesto que en este proyecto fin de carrera se ha realizado una herramienta de edición para XML Schema, es importante poder situar bien este tipo de documentos en su contexto, y mostrar su importancia como tecnología XML. Es por esto que en este apartado se intenta dar una visión general sobre qué es XML, qué nos ofrece y cuál es su importancia. Describiremos aquí por qué y de dónde surge XML, hablando para ello de SGML y HTML; veremos las principales características de este lenguaje, así como las reglas básicas para generar un documento XML; continuaremos por ver qué nos aporta este lenguaje, y finalizaremos con una extensa descripción de una de las tecnologías asociadas a XML: los Espacios de Nombre.

3.1-. ¿Qué es XML? Origen y objetivos.

XML son las siglas que designan el lenguaje extensible de marcas (eXtensible Markup Language). Para realizar una primera descripción de XML podemos decir que se trata de un lenguaje abierto, derivado de SGML, optimizado para su uso en la Web, y que permite describir el sentido o la semántica de los datos así como separar el contenido de la presentación.

XML fue desarrollado por un Grupo de Trabajo XML (originalmente conocido como "SGML Editorial Review Board" - Comisión de Revisión Editorial de SGML) formado bajo los auspicios del Consorcio World Wide Web (W3C) entre 1996 y 1998. Fue presidido por Jon Bosak de Sun Microsystems con la participación activa de un Grupo Especial de Interés en XML, también organizado en el W3C.

Los objetivos de diseño de XML son:

1. XML debe ser directamente utilizable sobre Internet. 2. XML debe soportar una amplia variedad de aplicaciones. 3. XML debe ser compatible con SGML. 4. Debe ser fácil la escritura de programas que procesen documentos XML. 5. El número de características opcionales en XML debe ser absolutamente

mínima, idealmente cero. 6. Los documentos XML deben ser legibles por humanos y razonablemente

claros. 7. El diseño de XML debe ser preparado rápidamente. 8. El diseño de XML debe ser formal y conciso. 9. Los documentos XML deben ser fácilmente creables. 10. La concisión en las marcas XML es de mínima importancia.

Esta especificación, junto con los estándares asociados (Unicode e ISO/IEC 10646 para caracteres, Internet RFC 1766 para identificación de lenguajes, ISO 639 para códigos de nombres de lenguajes, e ISO 3166 para códigos de nombres de países), proporciona toda la información necesaria para entender la Versión 1.0 de XML y construir programas de computador que los procesen.

3-. XML.

- 22 -

La recomendación de XML cita textualmente: “El lenguaje extensible de marcas abreviado XML, describe una clase de objetos de datos llamados documentos XML y parcialmente describe el comportamiento de programas de computador que puedan procesarlos.”. Como veremos a continuación, XML es un “perfil de aplicación” o lo que es lo mismo, una forma restringida de SGML, el Lenguaje Estándar Generalizado de Marcación (ISO 8879).

Pero ¿por qué era necesario XML? Para responder a esta pregunta es necesario ver algunas diferencias entre distintos lenguajes de marcado, que nos harán comprender mejor cuáles eran las limitaciones existentes y por qué surgió XML.

3.2-. HTML, SGML Y XML.

HTML es un lenguaje, definido por el metalenguaje SGML, que se utiliza en la web. A pesar de su sencillez, es sin duda un invento prodigioso: es el más exitoso sistema de presentación de documentos de la historia. Desde que apareció la WWW, gracias a HTML se ha podido publicar y acceder a más información de la que jamás se podría haber imaginado. Pero, a su vez, HTML ha sido víctima de su propio éxito: el gran crecimiento de Internet, los intereses comerciales y la necesidad de poder realizar páginas web vistosas, ha dado lugar a que en poco tiempo este lenguaje haya evolucionado muy rápidamente y, por desgracia, no siempre por el camino más adecuado. A pesar de haber superado la versión 4.0, rigidez e inflexibilidad siguen siendo características de este lenguaje. Y es que es un lenguaje limitado en cuanto que no nos permite realizar sobre Internet todas las aplicaciones o acciones que nos gustaría.

Por otro lado, SGML es el estándar internacional para la definición de la estructura y el contenido de diferentes tipos de documentos electrónicos. Permite el intercambio de documentos entre diferentes plataformas, y proporciona un modo consistente y muy preciso de aplicar etiquetas para describir un documento. Sin embargo, SGML presenta un problema muy importante: su gran complejidad.

Es en este contexto donde aparece XML. XML surge de SGML, manteniendo su filosofía, pero eliminando las partes más pesadas y engorrosas de este lenguaje, y las que pueden resultar menos útiles. Es algo así como “SGML simplificado”. Se ha llegado a decir que “XML ofrece el 80% de las ventajas de SGML con un 20% de su complejidad”. Durante el diseño de XML se intentó dejar fuera todas aquellas partes de SGML que fueran raramente utilizadas. La reducción fue todo un éxito: la especificación XML ocupa unas 50 páginas frente a las aproximadamente 500 de SGML.

HTML supuso una revolución porque permite la comunicación entre personas. La revolución de XML es que permite la comunicación entre máquinas. Sin embargo, no debe considerarse XML como un HTML++. Ambos lenguajes tienen su base en SGML, que es un meta-lenguaje: aquel que permite definir lenguajes para indicar la estructura y el contenido de nuestros documentos. Esta definición de estructura y contenido se realiza en una DTD: allí se indican los elementos que conformarán ese tipo de documento y cómo deben organizarse para que sea correcto. Un ejemplo de DTD es la que define cómo deben ser los documentos HTML. Por tanto, HTML no es más que un tipo de documento SGML que se utiliza en la Web. Por el contrario, XML no es ningún tipo de documento SGML, sino una versión abreviada de dicho lenguaje optimizado para usarlo en Internet. HTML es simplemente un lenguaje, mientras que

3-. XML.

- 23 -

XML es, al igual que SGML, un metalenguaje, esto es, un lenguaje para definir lenguajes.

¿Qué significa todo esto? Pues que con XML vamos a poder definir nuestros propios tipos de documentos, es decir, nuestras propias etiquetas, y por tanto ya no dependeremos de un único e inflexible tipo de documento HTML. XML aprovecha las innegables ventajas de HTML añadiendo muchas otras capacidades. A continuación veremos un ejemplo para aclarar todo esto un poco.

Supongamos que estamos tratando con la Web de una librería on-line. Para presentar la información sobre un libro, el código HTML podría ser por ejemplo el siguiente:

<p> <dt> <b> <a href="/exec/obidos/ASIN/0764531999/qid=919015337"> Xml: Lenguaje Extensible de Marcas</a></b> ~ <NOBR> <font color=#990033>Disponible normalmente en 24h</font> </NOBR> <dd> Varios Autores / Paperback / Publicado en 1998 <br> Nuestro Precio: €31.99 ~ <NOBR><font color =#990033>Se ahorra: €8.00 (20%)</font></NOBR> <br> <a href="/exec/obidos/ASIN/0764531999/qid=919015337">

<i>Lea más sobre este título...</i></a>

En XML podríamos describir el mismo libro de la siguiente manera:

<?xml version="1.0"?> <libro>

<titulo>Xml: Lenguaje Extensible de Marcas</titulo> <disponible tiempo="24" unidad="hours"/> <autor>Varios Autores</autor> <formato>Paperback</formato> <publicacion>1998</publicacion> <precio cantidad="31.99" moneda="euro"/> <descuento cantidad="20"/> <enlacelibro href="/exec/obidos/ASIN/0764531999/qid=919015337"/>

</libro>

Aquí se puede ver de forma evidente que cualquier programa informático

trabajará de forma mucho más eficiente sobre el código XML. El abanico de posibilidades que se nos abre gracias a XML es enorme: motores de búsqueda más eficaces, intercambio de información más fácil, cooperación entre empresas para facilitar el comercio electrónico, etc. La potencia de XML radica en que nos centramos en el contenido y no en la forma de presentarlo. Es aquí, en la presentación, donde entra en juego XSL (eXtensible Style Language): una familia de recomendaciones del W3C para definir la transformación y presentación de documentos XML. De esta tecnología

3-. XML.

- 24 -

simplemente comentar las tres partes que la componen: XSLT (XSL Transformations, un lenguaje para transformar XML); XPath (XML Path Language, lenguaje utilizado por XSLT para acceder o referirse a las distintas partes de un documento XML); XSL-FO (XSL Formating Objects, que es un vocabulario XML para especificar cómo se van a formatear unos datos para presentarlos en pantalla).

3.3-. Principales Características.

- SENCILLEZ: Es sin duda una de las razones fundamentales del éxito de este lenguaje. XML es un lenguaje basado en caracteres, y por tanto comprensible por los seres humanos. Aunque será una máquina la que realice finalmente el tratamiento, son los programadores y analistas los que tienen que tratar con el lenguaje, es por esto que el hecho de ser un lenguaje basado en caracteres es importante. Además, los documentos XML pueden leerse, escribirse y modificarse por medio de herramientas sencillas que utilizamos corrientemente, como puede ser un editor de texto. Otro ejemplo de sencillez es la capacidad de representar datos utilizando estructuras en forma de árbol, con las ventajas que esto conlleva.

- VARIEDAD DE ESTRUCTURAS DE DATOS: La estructura en forma de árbol

es lo suficientemente general y potente como para expresar datos con un cierto nivel de complejidad, suficiente para la mayoría de las aplicaciones.

- CARACTERES INTERNACIONALES: Hoy en día los negocios se realizan a

escala mundial. Esto es especialmente cierto a nivel de Internet. Para una aplicación web podemos tener por ejemplo transacciones comerciales que contengan caracteres chinos, árabes, rusos… La recomendación XML 1.0 está definida de acuerdo con el conjunto de caracteres ISO-10646 (Unicode), por lo que todos los caracteres que se utilizan en el mundo actualmente están recogidos y pueden ser utilizados. Esto da a XML una apertura a nivel mundial, haciendo incluso que se puedan borrar las fronteras nacionales.

- INTEROPERATIVIDAD: El número de características opcionales de XML debe

mantenerse en un mínimo, idealmente cero. Esto asegura una amplia difusión de los documentos XML. Al no tener prácticamente características opcionales, cualquier procesador XML será capaz de leer cualquier documento que se le presente. Esta es otra de las mejoras que ofrece XML con respecto a HTML para el cual cada navegador ofrece extensiones incompatibles con otros navegadores.

- PROGRAMACIÓN BASADA EN EL DOCUMENTO: XML está centrado en el

documento. Mientras que otros lenguajes de programación están basados en funciones, XML está basado en el documento. De programas que reciben unas entradas y producen unas salidas, pasamos a programas que reciben documentos y generan otros documentos, generalmente después de haber aplicado una serie de transformaciones. Por ejemplo, trabajar con documentos XML para el manejo de información y servir al cliente un documento XML que se obtenga a base de transformaciones.

3-. XML.

- 25 -

- EXTENSIBILIDAD Y FLEXIBILIDAD: Estas características permiten que XML pueda utilizarse para una gran cantidad de aplicaciones, desde páginas web hasta bases de datos, pasando por sistemas de mensajería para permitir la comunicación entre organizaciones o entre aplicaciones dentro de una misma organización.

- EXPORTABILIDAD: Facilidad para pasar del formato XML otros formatos de

publicación (papel, web, cd-rom, etc.).

3.4-. Documentos Bien Formados y Documentos Válidos.

Como ya sabemos, XML es un lenguaje de marcas. En este apartado veremos una serie de normas a tener en cuenta a la hora de escribir correctamente un documento XML, pero antes explicaremos unos conceptos referentes al procesamiento de estos documentos.

Los documentos XML están compuestos por unidades de almacenamiento llamadas entidades, que contienen tanto datos analizados como no analizados. Los datos analizados están compuestos de caracteres; entre estos caracteres podemos distinguir los que forman las marcas, y los que son realmente datos. Para leer un documento XML se utiliza un módulo software llamado procesador XML, que realizará su trabajo dentro de otro módulo llamado aplicación.

Vamos a ver ahora esas reglas para escribir documentos XML que comentamos anteriormente.

- La información debe ir incluida entre etiquetas, como en el siguiente ejemplo:

<etiqueta> información </etiqueta>

Aquí vemos la marca de apertura (<etiqueta>) así como la de cierre (</etiqueta>). En XML podemos dar el nombre que queramos a las etiquetas: esto permite tener etiquetas que estén relacionadas con el tema que estamos tratando. Por ejemplo, si estuviésemos tratando con libros podríamos tener etiquetas como título, autor, editorial, etc.

- Un detalle a tener en cuenta: un nombre en XML debe empezar con una letra, y continuar con letras, dígitos, rayas, dos puntos o puntos, denominados de forma general como caracteres de nombre. No se pueden crear nombres que empiezan con las letras ‘x’, ‘m’, ‘l’, en este orden y en cualquier combinación de mayúsculas y minúsculas (xml, XML, Xml, etc.), ya que estos están reservados.

- En la información contenida entre las marcas, podemos tener tanto texto plano

como otras marcas. Lo importante es que toda etiqueta que comience dentro de otra, también ha de terminar dentro de ella. Existe un elemento raíz que contiene a todos los demás elementos del documento, a excepción de comentarios e instrucciones de proceso, (descritos a continuación), que pueden situarse fuera del elemento raíz.

3-. XML.

- 26 -

- En un documento XML también podemos insertar comentarios. Los comentarios comienzan con "<!--" y terminan con "-->". Se puede emplazar comentarios en cualquier lugar del documento, excepto dentro de las propias etiquetas o dentro de otros comentarios. No se consideran parte del contenido textual de los documentos XML y son ignorados por los procesadores. Un ejemplo sencillo de comentario puede ser:

<!-- Esto es un comentario -->

- Existen también las denominadas instrucciones de proceso. Estas están pensadas para proporcionar información a las aplicaciones. Como los comentarios, no son parte del contenido textual de los documentos XML, pero a diferencia de ellos, los procesadores XML los tienen en cuenta y pasan la información que contienen a las aplicaciones designadas para procesar esa información. Los nombres de instrucciones de proceso que comiencen con "XML" se reservan para la normalización de XML, como el siguiente ejemplo:

<?xml version="1.0" encoding="UTF-7" standalone="yes"?>

- XML es un lenguaje sensible a mayúsculas. Es por esto que si se abre por ejemplo una etiqueta <Casa>, habrá que utilizar la etiqueta de cierre </Casa>. El cierre </casa> no sería correcto.

- Existen cinco caracteres reservados para una utilización especial. Si se quiere

incluir estos caracteres en el contenido de un elemento, se debe usar una forma alternativa de representarlos para evitar confusiones y problemas. En XML se utilizan las entidades para este fin. El siguiente cuadro resume las entidades utilizadas para representar distintos caracteres especiales.

Carácter representado Entidad usada

& &amp; &lt; &lt; &gt; &qt;

´ &apos; “ &quot;

Tabla 1: Entidades utilizadas para representar caracteres especiales. - Si se desea que el documento tenga sentido, debe haber ciertas restricciones en la

secuencia y forma de anidar los elementos. Esas restricciones pueden expresarse mediante una declaración. La DTD (Document Type Declaration) es uno de los tipos posibles de declaración en XML. Otra de las formas de realizar esto es XML Schema. Las declaraciones permiten a un documento comunicar meta-información sobre la estructura de su contenido a la aplicación que lo analiza. Esta meta-información incluye: la secuencia de elementos en el documento y la forma en que se anidan, los tipos de atributos, sus valores y sus valores por defecto, los nombres de archivos externos que se hallen referenciados en el documento, etc. Si no utiliza DTD, el documento debe comenzar con una Declaración de Documento Standalone (es decir, con el atributo Standalone inicializado a true.).

3-. XML.

- 27 -

- Todos los valores de los atributos deben ir entrecomillados. Se utiliza el carácter comilla simple (el apóstrofe) si el valor contiene comillas dobles, y viceversa. Si se necesitan ambos se utiliza &apos; y &quot;

- Los elementos VACIOS (los que no tienen etiqueta final como por ejemplo el elemento <br> de HTML) deben terminar con ‘/>’ o deben hacerse no VACIOS añadiéndoles una etiqueta de fin.

Después de ver todo lo anterior nos queda claro que no todo objeto de datos

puede ser considerado como documento XML. Para que así sea, el documento debe estar bien formado. El procesador que analiza el documento XML debe ser capaz de determinar si éste está bien formado, es decir, es correcto según la sintaxis XML y/o es válido, es decir, además de estar bien formado atiende a las restricciones definidas en su declaración (DTD, XML Schema...), en caso de que la tenga.

Por último, nos referiremos a la norma para profundizar un poco más en este

aspecto. Según la especificación del W3C, un objeto de texto es un documento bien formado si:

- Tomado como un todo, cumple la regla denominada document. - Respeta todas las restricciones de buena formación dadas en la especificación. - Cada una de las entidades analizadas que se referencia directa o indirectamente en

el documento está bien formada. Cumplir la regla document mencionada anteriormente significa:

- Que contiene uno o más elementos. - Hay exactamente un elemento raíz o elemento documento. De este elemento,

ninguna parte del contenido aparece en el contenido de ningún otro elemento. - Para el resto de elemento, si la etiqueta de comienzo está en el contenido de algún

otro elemento, la etiqueta de fin estará obligatoriamente en el contenido del mismo elemento, es decir, los elementos delimitados por etiquetas de principio y final se anidan adecuadamente mutuamente.

3.5-. Aportaciones de XML.

Vamos a ver a continuación qué es lo que XML aporta, cuáles son las ventajas que nos ofrece. A grandes rasgos, XML provee:

1. Independencia de los datos respecto a las aplicaciones. 2. “Información sobre la información”, es decir, un contexto. Esto es

extremadamente útil en su procesado informático. 3. Elementos para describir la estructura de un documento. 4. Herramientas para organizar la información a nuestro antojo. 5. Formas de garantizar que los datos cumplen ciertas restricciones.

3-. XML.

- 28 -

6. Métodos para visualizar la información. Una forma de variar al gusto la visualización de la información y capacidad para visualizar la información en función del contenido de la semántica del texto.

7. Capacidad para pasar información a las aplicaciones. 8. Enlaces para los datos relacionados.

En definitiva XML nos permite manejar, gestionar la información de manera

más racional, sencilla y personalizada.

3.6-. Espacios de Nombre:

Es cierto que existen muchísimas tecnologías asociadas a XML y no podemos nombrar aquí todas. Sin embargo, los espacios de nombres ocupan un lugar especial y se relacionan con XML Schema. Es por esto que haremos aquí una explicación de qué son y para qué sirven estos Espacios de Nombre.

3.6.1-. Introducción a los Espacios de Nombre.

La premisa principal de XML es la creación de un lenguaje de marcas formado por elementos totalmente personalizados. Esto es, el programador es el que dará nombre a todas las marcas de su archivo XML, y estas marcas pueden llevar cualquier nombre (siempre que sea válido). Cuando se crean elementos personalizados en un entorno cerrado no hay ningún problema, ya que podemos elegir nosotros los nombres y asignar marcas con distinto nombre de las ya utilizadas. El problema aparece cuando se mezclan muchos vocabularios XML. Es aquí donde aparecen los ESPACIOS DE NOMBRE.

Para introducirnos en el mundo de los espacios de nombre vamos a comenzar con un pequeño ejemplo. Supongamos que, por alguna razón, tenemos que mezclar dos (o más) documentos XML en uno de mayor tamaño. Por desgracia, alguno de los elementos ubicados en los distintos archivos tienen un mismo nombre. Por ejemplo, <pelicula> aparece en dos de los documentos XML. Los programadores necesitan un medio para poder disponer de todos los elementos en el documento único de mayor tamaño, aun cuando en XML todos los elementos deban tener nombres distintos. Para solucionar esto es para lo que se crearon los ESPACIOS DE NOMBRE (namespaces), que en realidad no es más que un “esquema de denominación”.

XML Namespaces es una iniciativa del W3C que no formaba parte de la especificación XML 1.0 original. En esa época, el W3C todavía estaba machacando los detalles sobre los espacios de nombre y cómo había que estructurarlos y usarlos en XML. XML Namespaces consiguió el estatus de recomendación del W3C en enero de 1999 y fue adoptada con prontitud, principalmente porque era una tecnología necesaria, ya que la mayoría de desarrolladores desean evitar el conflicto de nombres en documentos XML.

Un espacio de nombre puede tener el siguiente aspecto:

<prefix:nombreElemento />

3-. XML.

- 29 -

Ese prefix o prefijo al que se hace referencia es el espacio de nombre (en realidad es sólo parte una parte del espacio de nombre, pero eso se explicará un poco después). Un espacio de nombre no es nada más que un medio diferente de nombrar los elementos, de tal manera que los que tienen nombres duplicados puedan diferenciarse unos de otros.

Para comprender bien los espacios de nombre vamos a intentar explicarlo de la forma más sencilla posible, pero además vamos a hacer bastantes referencias a la norma del W3C para que así la explicación resulte lo más completa posible.

3.6.2-. Sintaxis.

Puesto que estamos intentando solucionar el problema de tener dos elementos iguales habrá que garantizar de alguna manera que los nombres de los elementos y atributos XML que asignamos son completamente únicos. Para esto se utilizarán los URI, lo veremos a continuación.

Lo primero que hay que hacer es declarar el espacio de nombre, de la siguiente manera:

<cualquierElemento xmlns:nombreLocal= “URI”>

¿Qué esta ocurriendo aquí exactamente? Es muy importante saber que un espacio de nombre tiene en realidad dos nombres: un “apodo” (hablando con propiedad, un nombre local) y un nombre real (el URI). Por ejemplo:

<movies xmlns:movie=http://www.thetribe.com/movies>

El nombre local es utilizado en el documento XML (eso es precisamente el prefijo que vimos en el apartado anterior: un nombre local del espacio de nombre, en este caso “movie”). El nombre real de un espacio de nombre es el URI (Universal Resource Identifier, identificador universal de recursos). Hay que tener cuidado: estamos llamándolo URI y no URL (Uniform Resource Locator, localizador uniforme de recursos). Sin embargo, si nos fijamos, vemos que tienen la misma sintaxis. ¿Cuál es la diferencia entonces, o por qué los llamamos URI? Una diferencia importante es que un URL debe apuntar a algo en Internet, mientras que un URI es simplemente una cadena de texto con el aspecto de un URL; puede estar realmente apuntando a algo, o no. El nombre real de un Espacio de Nombres debe ser único: en todo el mundo no puede haber otro espacio de nombre que tenga el mismo nombre real. Volvemos a recalcar: el URI no apunta a nada. Si escribe el nombre de un espacio de nombre en un navegador, probablemente reciba un mensaje de error de archivo no encontrado. Un URI es sólo un nombre, no necesariamente un objeto.

Según la norma, se considera que las referencias URI que identifican espacios de nombres son “idénticas” cuando son exactamente las mismas carácter por carácter. Obsérvese que las referencias URI que no sean idénticas en este sentido pueden ser de hecho funcionalmente equivalentes. Por ejemplo, referencias URI que sólo difieren en mayúsculas/minúsculas. Las referencias URI pueden contener caracteres no permitidos en nombres, de modo que no pueden utilizarse directamente como prefijos de espacios

3-. XML.

- 30 -

de nombres. Por tanto, el prefijo de espacio de nombres actúa como intermediario de una referencia URI.

Para terminar de liar esto, vamos a añadir que el nombre real también puede ser un URN(Universal Resource Name), y la sintaxis sería como sigue:

<movies xmlns:movie= “urn:thetribe.com:movies”>

Sólo diremos que los URI engloban a los URL y URN. Hay más diferencias, pero nosotros nos vamos a basar en URIs y ya hemos explicado bien qué son estos.

3.6.3-. Declaración de Espacios de Nombre.

Como dijimos anteriormente, los espacios de nombre se declaran en los documentos XML de la siguiente forma:

xmlns:Prefix=“NameSpace”

Un espacio de nombres se declara usando una familia de atributos reservados. El nombre de tales atributos debe o bien ser “xmlns”, o bien tener “xmlns:” como prefijo. Estos atributos, como cualquier otro atributo XML, se pueden proporcionar directamente o pueden tener un valor por defecto.

La palabra clave xmlns es lo que alerta a un procesador XML de que se está declarando un espacio de nombre. Ya sabemos que la parte prefix es el “apodo”, y servirá como referencia del espacio de nombres a lo largo del alcance del elemento en el que se declara el espacio de nombres. Sin embargo, este prefix es OPCIONAL, y dependerá de si queremos usar un elemento cualificado o no cualificado. Veremos esto a continuación, pero antes veamos un ejemplo:

Un ejemplo de declaración de espacio de nombres, que asocia el prefijo de espacio de nombres “edi” con el nombre de espacio de nombres http://ecommerce.org/schema:

<x xmlns:edi='http://ecommerce.org/schema'>

<!-- el prefijo "edi" está ligado a http://ecommerce.org/schema para el elemento "x" y sus contenidos -->

</x>

Existe una restricción sobre los prefijos: todos aquellos prefijos que comiencen con la secuencia de tres letras x, m, l, en cualquier combinación de mayúsculas y minúsculas, están reservados para su uso por las especificaciones de XML y las relacionadas con ellas. Es decir, no podríamos utilizar un prefijo del tipo “xmlcasa” ya que comienza por la secuencia de letras nombrada anteriormente.

3.6.3.1-.Nombres Cualificados y No Cualificados. Nombre cualificado: es aquel que incluye la porción prefix en la declaración del

espacio de nombres. Consta de dos partes: el prefijo y la porción local del nombre. Para

3-. XML.

- 31 -

utilizar nombres cualificados hay que incluir el prefix en la declaración del espacio de nombres.

Ejemplos: pelicula:director, pelicula:titulo, película:actor y película:año.

En la norma podemos observar la siguiente tabla:

QName ::= (Prefix´:´)?LocalPart Prefix ::= NCName LocalPart ::= NCName

Tabla 2: Nombres cualificados.

En la tabla anterior el Prefix (prefijo) proporciona la parte del prefijo del espacio de nombres del nombre cualificado, y debe estar asociado mediante una referencia URI a un espacio de nombres en una declaración de espacio de nombres. LocalPart proporciona la parte local del nombre cualificado.

Un ejemplo de nombre cualificado que funciona como tipo de elemento:

<x xmlns:edi='http://ecommerce.org/schema'> <!-- el nombre real del espacio de nombres del elemento 'price', es decir, su URI es http://ecommerce.org/schema -->

<edi:price units='Euro'>32.18</edi:price> </x>

Ejemplo de nombre cualificado que actúa como nombre de atributo:

<x xmlns:edi='http://ecommerce.org/schema'> <!-- el nombre real del espacio de nombres del atributo 'taxClass' es http://ecommerce.org/schema -->

<lineItem edi:taxClass="exempt">Baby food</lineItem> </x>

Nombre no cualificado: es aquel que no incluye un prefijo, y está asociado con

un espacio de nombre predeterminado o no está asociado con ninguno. No se necesita el prefix de la declaración del espacio de nombre al declarar un espacio de nombre predeterminado.

Ejemplos: director, titulo, actor, año.

La decisión de utilizar nombres cualificados o nombres no cualificados determinará la forma en que declararemos los espacios de nombre. Existen dos soluciones distintas para declarar espacios de nombre:

-Declaración Predeterminada o Por Defecto: El espacio de nombres se declara sin prefijo, y se hace referencia a todos los nombres y atributos que haya en su ámbito con nombres no cualificados y se presupone que éstos se encuentran en el espacio de nombres, esto es: el elemento que declara el espacio de nombre y todos sus descendientes son considerados parte de este espacio de nombre predeterminado, aunque no lleve prefijo y parezcan un XML normal. Es la solución más sencilla, y es útil cuando se quiere aplicar un espacio de nombre a un documento completo o a una sección de un documento. Si la referencia URI de la declaración de un espacio de

3-. XML.

- 32 -

nombres por defecto está vacía, entonces se considera que los elementos sin prefijo pertenecientes al ámbito de la declaración no están en ningún espacio de nombres. Obsérvese que los espacios de nombres por defecto no se aplican directamente a atributos.

Veamos algunos de ejemplos: <?xml version="1.0"?>

<!-- estos elementos están en el espacio de nombre HTML, en este caso por defecto --> <html xmlns='http://www.w3.org/TR/REC-html40'>

<head><title>Frobnosticación</title></head> <body><p>Movido <a href='http://frob.com'>aquí</a>.</p></body>

</html>

<?xml version="1.0"?> <!-- los tipos de elemento sin prefijo son de "books" --> <book xmlns='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'> <title>Cheaper by the Dozen</title> <isbn:number>1568491379</isbn:number> </book>

Veamos un ejemplo más desarrollado que ilustra el ámbito de los espacios de

nombre:

<?xml version="1.0"?> <!-- inicialmente, el espacio de nombres por defecto es "books" --> <book xmlns='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>

<title>Cheaper by the Dozen</title> <isbn:number>1568491379</isbn:number> <notes> <!-- hacemos a HTML el espacio de nombres por defecto para algunos comentarios -->

<p xmlns='urn:w3-org-ns:HTML'> ¡Este es un libro <i>muy</i> divertido!

</p> </notes>

</book>

Ejemplo de cadena vacía para el URI. Esto tiene el mismo efecto, dentro del ámbito de la declaración, que si no hubiera espacio de nombres por defecto.

<?xml version='1.0'?> <Beers> <!-- el espacio de nombres por defecto es ahora el de HTML --> <table xmlns='http://www.w3.org/TR/REC-html40'> <th><td>Name</td><td>Origin</td><td>Description</td></th> <tr> <!-- dentro de las celdas de la tabla no hay espacio de nombres por defecto--> <td><brandName xmlns="">Huntsman</brandName></td>

3-. XML.

- 33 -

<td><origin xmlns="">Bath, UK</origin></td> <td> <details xmlns=""><class>Bitter</class><hop>Fuggles</hop> <pro>Wonderful hop, light alcohol, good summer beer</pro> <con>Fragile; excessive variance pub to pub</con> </details> </td> </tr> </table> </Beers>

-Declaración Explícita: El espacio de nombres se declara con un prefijo, y todos los nombres de elementos y atributos que estén asociados con el espacio de nombres deberán usar el prefijo como parte de sus nombres cualificados. Este tipo de declaración resulta útil a la hora de crear un documento que se apoya en múltiples espacios de nombre. El prefijo de una declaración explícita se emplea como notación en el espacio de nombres que hay en el ámbito donde se declara el espacio de nombres. O dicho de otro modo, para que resulte más sencillo de comprender: el prefijo se empareja con el nombre del elemento o atributo locales, para formar un nombre cualificado de la forma Prefix:Local.

3.6.3.2-. Unicidad de Atributos. En documentos XML conformes con esta especificación, ninguna etiqueta puede

contener dos atributos que: 1. tengan nombres idénticos, o que 2. tengan nombres cualificados con la misma parte local y con prefijos que hayan

sido ligados a nombres de espacios de nombres que sean idénticos. Por ejemplo, cada una de las etiquetas iniciales mal que siguen es ilegal:

<!-- http://www.w3.org está ligado a n1 y n2 --> <x xmlns:n1="http://www.w3.org" xmlns:n2="http://www.w3.org" >

<mal a="1" a="2" /> <mal n1:a="1" n2:a="2" />

</x>

Sin embargo, las siguientes son legales. Puede resultar extraño que la segunda sea correcta. Es importante recordar, y ya lo dijimos anteriormente, que “el espacio de nombre por defecto no se aplica a los atributos”. Por esta razón, la segunda es correcta.

<!-- http://www.w3.org está ligado a n1 y es el valor por defecto --> <x xmlns:n1="http://www.w3.org" xmlns="http://www.w3.org" > <bien a="1" b="2" /> <bien a="1" n1:a="2" /> </x>

Una vez que hemos clarificado la sintaxis y la forma de declarar de los espacios

de nombre, vamos a dejar bien claro qué son y que no son éstos, para que no haya ningún tipo de confusión.

3-. XML.

- 34 -

3.6.4-. Qué son y qué no son los Espacios de Nombre.

Los espacios de nombre son…

- contenedores para nombres de elementos y atributos: no contienen los elementos mismos sino sus nombres. Por ejemplo, la lista de los alumnos de una clase. En la lista sólo están los nombres de los niños, no los propios niños.

- Un sistema de denominación en dos partes, pues tienen un nombre local y un

nombre de espacio de nombre (URI). No existen realmente como entidades físicas o conceptuales; no hacen nada excepto renombrar ciertos elementos.

Los espacios de nombre no son…

- una vía para combinar documentos XML, ni un instrumento para lo mismo. Es posible utilizar los espacios de nombre con este fin, sin embargo los espacios de nombre en si mismos no lo son.

- “punteros” a un sitio web. El URI de un espacio de nombre no apunta a nada,

son sólo identificadores, no páginas web ni archivos. Es mejo no intentar ejecutar el URI: lo mejor que puede pasar es que no pase nada.

- lo mismo que los espacios de nombre tradicionales. Éstos son un grupo de cero

o más nombres únicos. Cada nombre es único y sigue reglas (si existen) que gobiernan su apariencia. Algunos ejemplos de espacios de nombre tradicionales son:

# Los nombres de elementos permisibles en un documento XML. # Los códigos postales de EE.UU. # Números de teléfono. # Nombres científicos de todas las especies vegetales y animales.

- no tienen una estructura. Son solamente un racimo de nombres. Aunque se

defina un espacio de nombre para un grupo de elementos XML, y este grupo tenga una estructura, el espacio de nombre mismo ni siquiera ve la estructura. Conocerá su alcance (scope, se verá a continuación), pero no verá la estructura de los descendientes del elemento.

- los elementos no se colocan automáticamente en un espacio de nombre. Si no

se define un espacio de nombres, los elementos no formarán parte de él. Ciertos programas-instrumentos consideren el atributo xmlns como una “declaración de espacio de nombre”, mientras que otros sólo lo ven como un atributo. Por ejemplo, las DTD no ven los espacios de nombre, por tanto, xmlns es considerado como un atributo más. Sin embargo, los documentos de XML Esquema reconocen xmlns como una declaración de espacio de nombre.

3-. XML.

- 35 -

3.6.5-. Uso de Espacios de Nombre.

Como ya hemos visto, los espacios de nombre se declaran mediante el atributo xmlns. Cualquiera puede crear un espacio de nombre. Sin embargo, necesitamos un URI único en el mundo como dijimos anteriormente. Por tanto, sería bueno usar un nombre de dominio propio.

3.6.5.1-.Alcance. Como el propio nombre indica, alcance es la totalidad de los elementos

afectados por la declaración de espacio de nombre: el alcance es el nombre del elemento que contiene la declaración del espacio de nombre, así como todos los descendientes de este, incluidos los atributos.

Según la norma: “Se considera que la declaración del espacio de nombres se aplica al elemento en que está especificada y a todos los elementos pertenecientes al contenido de ese elemento, a menos que sea anulada por otra declaración de espacio de nombres”.

<?xml version="1.0"?> <!-- todos los elementos están explícitamente en el namespace HTML --> <html:html xmlns:html='http://www.w3.org/TR/REC-html40'> <html:head><html:title>Frobnosticación</html:title></html:head>

<html:body><html:p>Movido <html:a href='http://frob.com'>aquí.</html:a></html:p></html:body> </html:html>

Se pueden declarar varios prefijos de espacios de nombres como atributos de un

mismo elemento, como se muestra en este ejemplo: <?xml version="1.0"?> <!--ambos prefijos de espacios de nombres están disponibles en todas partes--> <bk:book xmlns:bk='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-3341-6'> <bk:title>Cheaper by the Dozen</bk:title> <isbn:number>1568491379</isbn:number> </bk:book>

3.6.5.2-.Ignorar un espacio de Nombres. Se puede ignorar un espacio de nombre mediante la reasignación de un nombre

local a un nuevo espacio de nombre, como muestra el siguiente ejemplo:

<wire:order xmlns:wire=http://www.wire-man.com/ns/1> <wire:store> <wire:shirt xmlns:wire=http://www.wire-man.com/ns/shirts> <wire:color>purple</wire:color> </wire:shirt> </wire:store>

3-. XML.

- 36 -

</wire:order>

No se puede “dejar de declarar” un espacio de nombres si hay un nombre local implicado. La única posibilidad es reasignarlo. Es decir, no se puede desconectar un prefijo como wire de su espacio de nombre http://www.wire-man.com/ns/1, pero si se puede reasignar un prefijo a otro nombre de espacio de nombres como http://www.wire-man.com/ns/shirts.

Lo que si está permitido es “dejar de declarar” un espacio de nombre predeterminado, mediante xmlns=“ ”.

<wire:order xmlns=“ ”>

3.6.5.3-. Espacios de Nombres Múltiples. Puede haber múltiples espacios de nombre al mismo tiempo en el alcance. Aquí

se muestra un ejemplo.

<wire:order xmlns:wire= “http://www.wire-man.com/ns/1”> <wire:store> <wire:shirt xmlns:stitch=“http://www.wire-man.com/ns/stitch”> <wire:color> <stitch:shade>lavender</stitch:shade>

</wire:color> </wire:shirt> </wire:store> </wire:order>

3.6.5.4-. Espacios de Nombres y Atributos. Cuando el nombre de un elemento forma parte de un espacio de nombre, todos

los nombres de atributo que son parte de ese elemento lo serán a su vez del espacio de nombre, automáticamente. No es necesario prefijar los nombres de atributo con el nombre local (aunque puede hacerse): sólo el elemento necesita un prefijo.

3.6.6-. Espacios de Nombres: DTDs y Esquemas XML.

3.6.6.1-. Espacios de Nombre y DTDs. Para poder validar un documento XML relleno con espacios de nombre contra

una DTD, hay que declarar en ésta cada elemento con prefijo por separado. Como dijimos en un apartado anterior, las DTD no saben nada sobre espacios de nombre. Para las DTD, “xmlns” es simplemente un atributo más; y los elementos con prefijo, elementos cuyos nombres contienen dos puntos.

En el siguiente ejemplo se muestra una DTD que define elementos con prefijo, y a continuación un XML que cumple la DTD:

3-. XML.

- 37 -

--DTD:

<?xml version= “1.0” encoding=“UTF-8”?> <!DOCTYPE wire:order [

<!ELEMENT wire:order (wire:store)> <!ATTLIST wire:order xmlns CDATA #FIXED http://www.wire-man.com/ns/1>

<!ELEMENT wire:store (#PCDATA)> ]>

-- XML basado en esta DTD:

<wire:order xmlns:= “http://www.wire-man.com/ns/1”> <wire:store>Stitch Store</wire:store> </wire:order>

La ausencia de soporte directo para espacios de nombre en las DTD es una de las

razones para que muchas personas hayan migrado al Esquema XML. Las DTD no pueden hacer nada cuando llega el momento de validar espacios de

nombre. Una DTD no valida cuándo un espacio de nombre es realmente único. Así, no existe nada parecido a una validación basada en los espacios de nombre, como cabría esperar. Es IMPORTANTE tener claro esto último: los espacios de nombre no influyen de ninguna forma en la validación de un documento. Esto puede llegar a confundirnos, ya que el nombre del espacio de nombre aparenta ser un URL dirigido a algún tipo de documento, y ese documento ser una referencia de algún tipo para el espacio de nombre: no hay que olvidar nunca que el URI es simplemente un identificador.

3.6.6.2-. Espacios de Nombre y Esquema XML. El esquema XML maneja los espacios de nombre un poco más elegante y

directamente que las DTD. En una DTD hay que declarar cada elemento con su prefijo. Cuando utiliza espacios de nombre con Esquema XML, es preferible crear un documento de Esquema XML separado para cada espacio de nombre que se vaya a utilizar. Esto quizás pueda resultar tedioso, sin embargo, la gran ventaja es que en el documento de Esquema XML sólo es necesario especificar el nombre del espacio de nombre (URI). Justo al revés que en la DTD, donde definíamos elementos con su nombre local. Esto significa que, cuando los elementos de un espacio de nombre estén definidos en un documento de Esquema XML, se podrá usar cualquier prefijo que se quiera en el XML activo. El siguiente ejemplo muestra como crear un documento de Esquema XML que sobrentienda el uso de espacios de nombre en un documento XML. Todo lo que hay que hacer es añadir unos pocos atributos a xsd:schema, como vemos a continuación.

---Un documento XML: <? xml version=“1.0” encoding=“UTF-8”?>

3-. XML.

- 38 -

<pants:order xmlns:xsi=“http://www.w3.org/2000/10/XMLSchema-instance” xsi:noNamespaceSchemaLocation=“namespace2.xsd” xmlns:pants=“http://www.wire-man.com/ns/1”>

<store>30 paisley Capri</store> </pants:order>

---El Esquema XML para lo anterior se codifica como sigue:

<? xml version=“1.0” encoding=“UTF-8”?> 1. <xsd:schema 2. xmlns:xsd= “http://www.w3.org/2000/10/XMLSchema” 3. targetNamespace=“http://www.wire-man.com/ns/1” 4. xmlns:wire= “http://www.wire-man.com/ns/1”>

<xsd:element name= “order”> <xsd:complexType>

<xsd:sequence> <xsd:element name= “store” type= “xsd:string” />

</xsd:sequence> </xsd:complexType>

</xsd:element> </xsd:schema>

---Explicación del código:

1. Cualquier cosa que defina un espacio de nombre va en el elemento xsd:schema.

2. Esta es la línea que define este documento XML como un Esquema XML. 3. targetNamespace determina qué nombre de espacio de nombre (URI)

puede usar el XML. En el XML superior, observamos que hemos declarado un espacio de nombre llamado “pants” correspondiente a http://www.wire-man.com/ns/1

4. Para hacer válido targetNamespace, debemos declarar un espacio de nombre en el documento de Esquema XML usando el mismo URI que en targetNamespace. (Esto forma parte de la configuración de Esquema XML). Hay que fijarse que el nombre local utilizado en el documento de Esquema XML (“wire”) no tiene por qué ser el mismo que el del documento XML (“pants”)

Obsérvese que hay tres atributos en total con el mismo valor: targetNamespace, xmlns:wire y xmlns:pants.

Aún nos falta algo por ver: el método descrito sólo desliza los elementos globales en el espacio de nombre. Esto es, si nos fijamos en el documento XML, vemos que store no está prefijado con pants. Se necesita otro atributo nuevo para asignar el espacio de nombre a todos los elementos. Este es elementFormDefault= “qualified”.

<xsd:schema xmlns:xsd= “http://www.w3.org/2000/10/XMLSchema” targetNamespace=“http://www.wire-man.com/ns/1”

3-. XML.

- 39 -

xmlns:wire= http://www.wire-man.com/ns/1 elementFormDefault= “qualified”>

Para finalizar, añadimos que si se quiere incluir unos elementos y no otros en el espacio de nombre, se debe ignorar elementFormDefault en xsd:schema y añadir form:= “qualified” al elemento individual. Si la situación se invierte y lo que se desea es excluir un elemento de un espacio de nombre, simplemente se añade el atributo form:= “unqualified”:

<xsd:schema xmlns:xsd= “http://www.w3.org/2000/10/XMLSchema” targetNamespace=http://www.wire-man.com/ns/1 xmlns:wire= “http://www.wire-man.com/ns/1”>

<xsd:element name= “order”> <xsd:complexType>

<xsd:sequence> <xsd:element name=“store” type=“xsd:string” form=“qualified”/> </xsd:sequence>

</xsd:complexType> </xsd:element>

</xsd:schema>

3.7-. Conclusiones.

Hemos hablado en este capítulo de todas las ventajas que ofrece XML, y nos hemos centrado en la descripción de una de las tecnologías asociadas a él: los espacios de nombre. Hemos visto la importancia de XML en la actualidad, y hemos comentado también que podemos encontrarnos con la situación en que necesitemos unir varios documentos XML y sea necesario diferenciar las etiquetas: es ahí donde surgen los espacios de nombre. XML Schema da soporte a estos Espacios de Nombre (cosa que no hacen las DTDs), de ahí la importancia de este tipo de declaración, y la necesidad de disponer de herramientas potentes que nos permitan trabajar con XML Schema de forma sencilla y eficiente.

En el próximo capítulo hablaremos de XML Schema. Profundizaremos más en las diferencias entre las DTDs y XML Schema y conoceremos el lenguaje con mayor profundidad.