Espacio de nombres XML
Un espacio de nombres XML es una recomendación W3C para proporcionar elementos y atributos con nombre único en un archivo XML. Un archivo XML puede contener nombres de elementos o atributos procedentes de más de un vocabulario XML. Si a cada uno de estos vocabularios se le da un espacio de nombres, un ámbito semántico propio, referenciado a una URI donde se listen los términos que incluye, se resuelve la ambigüedad existente entre elementos o atributos que se llamen igual, la homonimia. Los nombres de elementos dentro de cada espacio de nombres deben ser únicos.
Uso de los espacios de nombres
Un ejemplo sería una instancia XML que contuviera referencias a un cliente y a un producto solicitado por este. Tanto el elemento que representa el cliente como el que representa el producto pueden tener un elemento hijo llamado "numero_ID". Las referencias al elemento "numero_ID" podrían ser ambiguas, salvo que los elementos, con igual nombre pero significado distinto, se llevaran a espacios de nombres distintos que los diferenciaran.
<?xml version="1.0"?>
<cli:cliente xmlns:cli='http://es.wikipedia.org/wiki/Espacio_de_nombres_XML/cliente'
xmlns:ped='http://es.wikipedia.org/wiki/Espacio_de_nombres_XML/pedido'>
<cli:numero_ID>1232654</cli:numero_ID>
<cli:nombre>Fulanito de Tal</cli:nombre>
<cli:telefono>99999999</cli:telefono>
<ped:pedido>
<ped:numero_ID>6523213</ped:numero_ID>
<ped:articulo>Caja de herramientas</ped:articulo>
<ped:precio>187,91</ped:precio>
</ped:pedido>
</cli:cliente>
Declaración de espacios de nombres
Un espacio de nombres se declara usando el atributo XML reservado xmlns
, cuyo valor debe ser un identificador uniforme de recurso.
Por ejemplo:
xmlns="http://www.w3.org/1999/xhtml"
Sin embargo, el URI no se lee realmente como una dirección; se trata como una cadena de texto por el analizador sintáctico (parser) XML. Por ejemplo, el propio http://www.w3.org/1999/xhtml no contiene código alguno, simplemente describe el espacio de nombres XHTML a lectores humanos. El hecho de usar una URL (tal como "http://www.w3.org/1999/xhtml") para identificar un espacio de nombres, en lugar de una simple cadena (como "xhtml"), reduce la posibilidad de que diferentes espacios de nombres usen identificadores iguales. Los identificadores de los espacios de nombres no necesitan seguir las convenciones de las direcciones de internet, aunque a menudo lo hagan.
La declaración puede incluir también un prefijo corto con el que los elementos y atributos pueden identificarse, por ejemplo:
xmlns:xhtml="http://www.w3.org/1999/xhtml"
Un espacio de nombres XML no necesita que su vocabulario sea definido, aunque es una buena práctica utilizar un DTD o un esquema XML para definir la estructura de datos en la ubicación URI del espacio de nombres.
Alcance de los espacios de nombres
El alcance de la declaración de un prefijo de espacio de nombres comprende desde la etiqueta de inicio de un elemento XML, en la que se declara, hasta la etiqueta final de dicho elemento XML. En las etiquetas vacías, correspondientes a elementos sin "hijos", el alcance es la propia etiqueta.
Espacio de nombres por defecto
Cuando se define en la etiqueta de inicio de un elemento XML, se aplica a todos elementos sin prefijo del ámbito del elemento, pero no a los atributos.
<?xml version="1.0"?> <cliente xmlns='http://es.wikipedia.org/wiki/Espacio_de_nombres_XML/cliente' xmlns:ped='http://es.wikipedia.org/wiki/Espacio_de_nombres_XML/pedido'> <numero_ID>1232654</numero_ID> <nombre>Nombre</nombre> <telefono>99999999</telefono> <ped:pedido> <ped:numero_ID>6523213</ped:numero_ID> <ped:articulo>Caja de herramientas</ped:articulo> <ped:precio>187,90</ped:precio> </ped:pedido> </cliente>
Unicidad de los atributos
Ningún elemento XML puede tener dos atributos con el mismo nombre expandido. El siguiente caso violaría esta restricción, ya que los dos atributos del elemento tendrían el mismo nombre expandido (http://es.wikipedia.org/wiki/Espacio_de_nombres_XML/ns:atributo).
<?xml version="1.0"?> <raiz xmlns:ns1="http://es.wikipedia.org/wiki/Espacio_de_nombres_XML/ns" xmlns:ns2="http://es.wikipedia.org/wiki/Espacio_de_nombres_XML/ns"> <elemento ns1:atributo="hola" ns2:atributo="adios" /> </raiz>