Está en la página 1de 12

Servicios Web 2011

ESPACIO DE NOMBRES XML


En el mundo de las bases de datos es habitual encontrarse con situaciones tales como que
un mismo nombre haga referencia a un cliente y tambin a un proveedor de forma simultnea, y sin
embargo ello no acaba siendo un inconveniente, cuando potencialmente es un riesgo.
El uso simultneo de un mismo nombre conlleva el riesgo de que se produzcan colisiones de
nombres, esto es, que elementos de diferentes espacios de nombres puedan tener el mismo
nombre. Por ejemplo, es posible que utilicemos el elemento hora para marcar datos referidos a la
hora en que ocurri un incidente en la carretera, mientras que un operador podra utilizar hora para
referirse al momento en que debe hacer una inspeccin a un sistema, y si ambos elementos se
llegaran a utilizar en un mismo documento, se dara una colisin, al no poder distinguir qu clase de
datos contendra el elemento hora. Para evitar estas colisiones, en XML se recurre al uso de
prefijos adecuados, de la forma :
<incidente:hora>06:33:19</incidente:hora>
<inspeccion:hora>08:45:22</inspeccion:hora>
Otro ejemplo es : imagnese que necesita hacer un archivo xml que contenga elementos de
mltiples fuentes independientes entre s, estos pueden tener problemas de reconocimiento y
colisin. Puede ser que estemos utilizando dos vocabularios que utilizan el mismo tipo de elemento o
nombre de atributo. Por ejemplo:
<?xml version=1.0" encoding="iso-8859-1"?>

<direccion>
<calle>Avd. Diagonal 8</calle>
<ciudad>Barcelona</ciudad>
<provincia>Barcelona</ciudad>
<pais>Espaa</pais>

</direccion>
<?xml version=1.0" encoding="iso-8859-1"?>
<servidor>
<url>http://www.palotes.com</url>
<direccion>123.45.67.8</direccion>
</servidor>

Los dos documentos XML anteriores tienen en comn el elemento direccion. Por el momento son
dos vocabularios diferentes pero puede ser que en algn momento tengamos que integrarlos en un
mismo documento XML. Supongamos que ambos documentos juntos nos ofrecen informacin sobre
la localizacin de una empresa: su direccin fsica y su direccin en Internet. Est claro que el
elemento direccin va a provocar problemas. Podramos renombrarlo y en el segundo documento

Servicios Web 2011


XML llamarlo ip-servidor, pero no es una buena solucin. Una posible solucin es ponerlo de la
siguiente manera:
<?xml version=1.0" encoding="iso-8859-1"?>
<empresa>
<nombre>Palotes S.A.</nombre>
<dirfis:direccion xmlns:dirfis="http://www.palotes.com/direccionfisica">
<dirfis:calle>Avd. Diagonal 8</dirfis:calle>
<dirfis:ciudad>Barcelona</dirfis:ciudad>
<dirfis:provincia>Barcelona</dirfis:ciudad>
<dirfis:pais>Espaa</dirfis:pais>
</dirfis:direccion>
<dirserv:servidor xmlns:dirserv="http://www.palotes.com/direccionservidor">
<dirserv:url>http://www.palotes.com</dirserv:url>
<dirserv:direccion>123.45.67.8</dirserv:direccion>
</dirserv:servidor>
</empresa>

En la que como podemos observar los elementos de ambos vocabularios estn bien
diferenciados.
Qu es exactamente un "namespace"?
Un "namespace" XML es una coleccin de nombres, identificados por un URI, que se utiliza en los
documentos XML para identificar los nombres de los elementos y atributos.
Declaracin de un "namespace"
Como podemos observar en el ejemplo, la declaracin del "namespace" se realiza mediante el
atributo xmlns, cuyo valor es un URI que identifica de forma unvoca el nombre.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
El atributo xmlns puede ir seguido del carcter dos puntos :, opcional, y el nombre del
"namespace":
Por tanto la declaracin de un espacio de nombres consta de :
Palabra clave xmlns definida por el W3C para identificar espacios de nombres XML. Esta se
separa del prefijo mediante dos puntos ( : ).
Prefijo o nombre abreviado del espacio de nombres que se utiliza en la declaracin de
todos los elementos y atributos que pertenecen al mismo.
Definicin que corresponde al URI que define el espacio de nombres de forma exclusiva.

Servicios Web 2011

EJERCICIO 2:
Realice un tercer archivo xml que integre los elementos de los 2 archivos siguientes :
<?xml version = 1.0 ?>
<archivos>
<fichero nombrefichero = libro.xml>
<descripcion>Una lista de libros</descripcion>
</fichero>
</archivo>

<?xml version = 1.0 ?>


<galera>
<fichero nombrefichero = gracioso.jpg>
<descripcion>Un dibujo gracioso</descripcion>
<tamao ancho = 200 largo = 100 />
</fichero>
</galera>
Al unir los dos archivos anteriores cheque lo siguiente:

<?xml version="1.0" encoding="UTF-8"?>


<texto:directorio xmlns:texto="urn:martin:textoInfo"
xmlns:imagen="urn:martin:imagenInfo">
<texto:fichero nombrefichero="libro.xml">
<texto:descripcion>Lista de Libros</texto:descripcion>
</texto:fichero>
<imagen:fichero nombrefichero="gracioso.jpg">
<imagen:descripcion>Un dibujo gracioso</imagen:descripcion>
<imagen:tamao ancho="200" largo="200"/>
</imagen:fichero>
</texto:directorio>

Servicios Web 2011

Otra forma de realizarlo:

<empresa>
<texto:directorio xmlns:texto="http://www.practica.com/uno">
<texto:fichero nombrefichero="libro.xml">
<texto:descripcion>Lista de Libros</texto:descripcion>
</texto:fichero>
</texto:directorio>
<imagen:catalogo xmlns:imagen="http://www.practica.com/uno">
<imagen:fichero nombrefichero="gracioso.jpg">
<imagen:descripcion>Un dibujo gracioso</imagen:descripcion>
<imagen:tamao ancho="200" largo="200"/>
</imagen:fichero>
</imagen:catalogo>
</empresa>

Es muy importante tener en cuenta que los URIs slo se utilizan para que el nombre sea
nico, no son enlaces, ni tienen que contener informacin, sin embargo, tambin los URIs sirven
para acceder a recursos. Los XML Namespaces describen cmo se puede asociar una URI con
cada etiqueta y atributo en un documento XML, si bien, para qu se utiliza el URI depende de la
aplicacin que lea el URI. Por ejemplo, RDF, (http://www.w3.org/TR/REC-rdf-syntax/) el estndar del
W3C para metadatos, lo usa para enlazar cada metadato a un archivo definiendo el tipo de ese
metadato).

Espacios de nombre defecto


Al objeto de que el autor de un documento pueda evitarse tener que colocar constantemente
un prefijo, normalmente el ms usado se puede especificar un espacio de nombres por defecto para
un elemento de forma que tambin se usa para sus elementos hijo que no incorporen ningn prefijo.
Se declara con un atributo xmlns sin prefijo y se considera que es vlido, tanto en el elemento en

Servicios Web 2011


el que ha sido declarado, como en todos los elementos dentro de su contenido; por ello en particular,
para declarar un espacio de nombres por defecto en todo el documento basta con usar este atributo
xmlns en el elemento raz. Con el uso de un espacio de nombres por defecto, si no aparece
ninguno, se usa ste y todos los elementos del documento sin prefijo se tratarn como
pertenecientes a l: por ejemplo :
<?xml version = 1.0?>
<revista xmlns=http://www.miservidor.com/revistas>
<articulo>
<titulo>Introduccin a los Espacios de Nombres</titulo>
<autor>Vicente Perez</autor>
<cuerpo>Los espacios de nombres son simples .</cuerpo>
</articulo>
</revista>

Al usar un espacio de nombres por defecto, el documento es ms claro y


fcil de leer, aunque se deben tener precauciones con ello, pues cuando el archivo
se importe o se incluya en otro documento, hay que asegurarse de que no se
producen colisiones de nombres no previstas.

Servicios Web 2011

Ejercicios para realizar:

En este tutorial se usaran tres conjuntos artificiales de elementos: el conjunto de


las minsculas, de las maysculas y de los xnumeros. Para un lector humano es
muy fcil determinar a que conjunto pertenece cada elemento. Pero un ordenador
no tiene el conocimiento a priori que tiene el ser humano, as que es necesario
codificar ese razonamiento lgico en una aplicacin.

<aaa >
<bbb >
<ccc />
</bbb>
<BBB >
<CCC />
</BBB>
<x111 >
<x222 />
</x111>
</aaa>

Los nombres de atributo que comienzan con xmlns se usan slo para declarar
namespaces. Se puede declarar un namespace en cada elemento que se use,
pero est forma de actuar es pesada y el cdigo resultante es bastante ilegible.

<lower:aaa xmlns:lower = "http://zvon.org/lowercase" >


<lower:bbb xmlns:lower = "http://zvon.org/lowercase" >
<lower:ccc xmlns:lower = "http://zvon.org/lowercase" />
</lower:bbb>

Servicios Web 2011


<upper:BBB xmlns:upper = "http://zvon.org/uppercase" >
<upper:CCC xmlns:upper = "http://zvon.org/uppercase" />
</upper:BBB>
<xnumber:x111 xmlns:xnumber = "http://zvon.org/xnumber" >
<xnumber:x222 xmlns:xnumber = "http://zvon.org/xnumber" />
</xnumber:x111>
</lower:aaa>

Ir declarando namespaces con cada elemento como en Ejemplo 2 inducira a error y sera
muy poco prctico. Segn el standar, se puede realizar esta tarea de varias maneras. La
declaracin de namespace dada para el elemento que se analiza tambin es valida para
todos los elementos que se anidan dentro de l ( para todos sus hijos o descendientes)

<lower:aaa xmlns:lower = "http://zvon.org/lowercase" >


<lower:bbb >
<lower:ccc />
</lower:bbb>
<upper:BBB xmlns:upper = "http://zvon.org/uppercase" >
<upper:CCC />
</upper:BBB>
<xnumber:x111 xmlns:xnumber = "http://zvon.org/xnumber" >
<xnumber:x222 />
</xnumber:x111>
</lower:aaa>

Servicios Web 2011


Se acostumbra a declarar todos los namespaces en el elemento raiz

<lower:aaa xmlns:lower = "http://zvon.org/lowercase" xmlns:upper =


"http://zvon.org/uppercase"
xmlns:xnumber = "http://zvon.org/xnumber" >
<lower:bbb >
<lower:ccc />
</lower:bbb>
<upper:BBB >
<upper:CCC />
</upper:BBB>
<xnumber:x111 >
<xnumber:x222 />
</xnumber:x111>
</lower:aaa>

El valor del atributo xmlns identifica el namespace, no el prefijo. En este ejemplo,


todos los elementos pertenecen al mismo namespace, aunque se utilizan
diferentes prefijos.

<lower:aaa xmlns:lower = "http://zvon.org/lowercase" xmlns:upper =


"http://zvon.org/lowercase"
xmlns:xnumber = "http://zvon.org/lowercase" >
<lower:bbb >
<lower:ccc />
</lower:bbb>
<upper:BBB >
<upper:CCC />
</upper:BBB>
<xnumber:x111 >
<xnumber:x222 />
</xnumber:x111>
</lower:aaa>

Servicios Web 2011


En el Ejemplo 5 todos los elementos pertenecan al mismo namespace, aunque tenan
diferentes prefijos, mientras que en este caso pertenecen a diferentes namespaces,
aunque todos tienen el mismo prefijo.

<aaa >
<lower:bbb xmlns:lower = "http://zvon.org/lowercase" >
<lower:ccc />
</lower:bbb>
<lower:BBB xmlns:lower = "http://zvon.org/uppercase" >
<lower:CCC />
</lower:BBB>
<lower:x111 xmlns:lower = "http://zvon.org/xnumber" >
<lower:x222 />
</lower:x111>
</aaa>

No es necesario declarar explicitamente los Namespaces con sus prefijos. El


atributo xmlns define el namespace por defecto para el elemento donde est y
todos sus descendientes.

<aaa >
<bbb xmlns = "http://zvon.org/lowercase" >
<ccc />
</bbb>
<BBB xmlns = "http://zvon.org/uppercase" >
<CCC />
</BBB>
<x111 xmlns = "http://zvon.org/xnumber" >
<x222 />
</x111>
</aaa>

Servicios Web 2011


Aunque se usen namespaces implicitos, siempre se pueden indicar explicitamente
los namespaces de los elementos elegidos.

<aaa xmlns:upper = "http://zvon.org/uppercase" xmlns:xnumber =


"http://zvon.org/xnumber" >
<bbb xmlns = "http://zvon.org/lowercase" >
<ccc />
<upper:WWW />
<xnumber:x666 />
</bbb>
<BBB xmlns = "http://zvon.org/uppercase" >
<upper:WWW />
<xnumber:x666 />
<CCC />
</BBB>
<x111 xmlns = "http://zvon.org/xnumber" >
<x222 />
<upper:WWW />
<xnumber:x666 />
</x111>
</aaa>

Una declaracin de namespaces por defecto puede quitarse si se vuelve a


declarar el namespace usando una cadena vaca como valor.

<aaa xmlns = "http://zvon.org/lowercase" >


<bbb >
<ccc xmlns = "" >
<ddd />
</ccc>
</bbb>
</aaa>

10

Servicios Web 2011


Tambin se puede indicar explicitamente que un atributo pertenece a un
determinado namespace.

<lower:aaa xmlns:lower = "http://zvon.org/lowercase" xmlns:upper =


"http://zvon.org/uppercase"
xmlns:xnumber = "http://zvon.org/xnumber" >
<lower:bbb lower:zz = "11" >
<lower:ccc upper:WW = "22" />
</lower:bbb>
<upper:BBB lower:sss = "***" xnumber:S111 = "???" />
<xnumber:x111 />
</lower:aaa>

Los atributos sin prefijo no pertenecen nunca a ningn namespace

<lower:aaa xmlns:lower = "http://zvon.org/lowercase" xmlns:upper =


"http://zvon.org/uppercase"
xmlns:xnumber = "http://zvon.org/xnumber" >
<lower:bbb zz = "11" >
<lower:ccc WW = "22" />
</lower:bbb>
<upper:BBB sss = "***" xnumber:S111 = "???" />
<xnumber:x111 />
</lower:aaa>

Los atributos no pertenecen a un namespace, ni siquiera cuando hay un


namespace definido por defecto.

<aaa xmlns = "http://zvon.org/lowercase" xmlns:upper =


"http://zvon.org/uppercase"
xmlns:xnumber = "http://zvon.org/xnumber" >
<bbb zz = "11" >
<ccc WW = "22" xmlns = "http://zvon.org/uppercase" />
</bbb>
<upper:BBB sss = "***" xnumber:S111 = "???" />
<xnumber:x111 />
</aaa>

11

Servicios Web 2011


La declaracin de namespace afecta slo al mbito de influencia del elemento
donde ha sido declarada.

<aaa xmlns:lower = "http://zvon.org/lowercase" >


<lower:BBB xmlns:lower = "http://zvon.org/uppercase" >
<lower:x111 />
<sss xmlns:lower = "http://zvon.org/xnumber" >
<lower:x111 />
</sss>
</lower:BBB>
<lower:x111 />
</aaa>

y disfrutad este ltimo ejemplo.

<OOO xmlns = "http://zvon.org/xnumber" xmlns:lower =


"http://zvon.org/lowercase"
ooo = "222" >
<aaa xmlns:lower = "http://zvon.org/lowercase" >
<lower:BBB xmlns:lower = "http://zvon.org/uppercase" >
<lower:x111 />
<sss xmlns:lower = "http://zvon.org/xnumber" >
<lower:x111 />
</sss>
</lower:BBB>
<lower:x111 />
</aaa>
<aaa xmlns = "http://zvon.org/uppercase" >
<BBB xmlns:upper = "http://zvon.org/uppercase" upper:U = "A"
U = "A" lower:U = "A" />
</aaa>
<aaa xmlns = "http://zvon.org/lowercase" >
<upper:BBB xmlns:upper = "http://zvon.org/uppercase" xmlns =
"http://zvon.org/xnumber" >
<x111 />
</upper:BBB>
<x111 />
</aaa>
</OOO>

12