Saltar al contenido principal

Espacios de nombres

En XML, los espacios de nombres (namespaces) son un mecanismo para evitar conflictos de nombres entre elementos y atributos de diferentes vocabularios o esquemas, es decir, para evitar ambigüedades que podrían surgir en caso de que haya elementos o atributos con el mismo nombre. Esto ocurre cuando fusionamos varios ficheros XML en uno solo y se presentan elementos con el mismo nombre, pero con diferente significado.

Los namespaces asignan un prefijo único a un conjunto de elementos y atributos de un vocabulario específico, permitiendo que los elementos y atributos de diferentes vocabularios coexistan en el mismo documento sin causar conflictos. Además, también nos permite agrupar todos los elementos y atributos relacionados de una aplicación XML para que el software pueda reconocerlos con facilidad.

También es posible no indicar ningún prefijo. En ese caso, el namspace hace referencia a todos los elementos y atributos en el documento. Es decir, existe un vocabulario único para todo el documento XML.

Namespace con prefijo

En el siguiente ejemplo se muestra cómo se declaran dos namespaces:

<?xml version="1.0" encoding="UTF-8"?>
<cartas
xmlns:baraja="https://www.lmsgi.com/baraja"
xmlns:restaurante="https://www.lmsgi.com/restaurante">

<baraja:carta>
<baraja:palo>Corazones</baraja:palo>
<baraja:numero>7</baraja:numero>
</baraja:carta>

<restaurante:carta>
<restaurante:carnes>
<restaurante:carne restaurante:precio="12.95">Filete de ternera</restaurante:carne>
<restaurante:carne restaurante:precio="13.60">Solomillo a la pimienta</restaurante:carne>
</restaurante:carnes>

<restaurante:pescados>
<restaurante:pescado restaurante:precio="16.20">Lenguado al horno</restaurante:pescado>
<restaurante:pescado restaurante:precio="15.85">Merluza en salsa verde</restaurante:pescado>
</restaurante:pescados>
</restaurante:carta>

</cartas>

En el documento anterior se están integrandos dos tipos de cartas:

  • La carta de una baraja, definido en xmlns:baraja.
  • La carta de un restaurante, definido en xmlns:restaurante.

El nombre utilizado para los elementos (carta) es el mismo en ambos casos, pero no tienen el mismo significado, por lo que se ha decidido crear dos espacios de nombres o, lo que es lo mismo, dos vocabularios diferentes.

Para indicar que un elemento pertenece a un espacio de nombres, se debe utilizar el prefijo en la etiqueta:

<baraja:carta></baraja:carta>
<restaurante:carta></restaurante:carta>

Ocurre lo mismo con los atributos:

<restaurante:carne restaurante:precio="12.95">Filete de ternera</restaurante:carne>

Namespace sin prefijo

También es posible no indicar ningún prefijo:

<?xml version="1.0" encoding="UTF-8"?>
<baraja xmlns="https://www.lmsgi.com/baraja">
<carta>
<palo>Corazones</palo>
<numero>7</numero>
</carta>
</baraja>

Veremos que en XSD se utilizará la declaración de namespaces tanto con prefijo como sin prefijo.