Saltar al contenido principal

Espacios de nombres

Los espacios de nombres (namespaces) permiten resoler las ambigüedades que se pueden producir al juntar dos documentos XML distintos que han utilizado el mismo nombre de etiqueta para representar cosas distintas. Los namespaces definen la pertenencia de los elementos y los atributos de un documento XML a un contexto de un vocabulario XML.

Supongamos los siguientes documentos (baraja.xml y restaurante.xml):

baraja.xml
<carta>
<palo>Corazones</palo>
<numero>7</numero>
</carta>
restaurante.xml
<carta>
<carnes>
<filete_de_ternera precio="12.95"/>
<solomillo_a_la_pimienta precio="13.60"/>
</carnes>
<pescados>
<lenguado_al_horno precio="16.20"/>
<merluza_en_salsa_verde precio="15.85"/>
</pescados>
</carta>

Si juntamos ambos documentos en un solo, quedaría de la siguiente forma:

<ejemplo> <!-- Debemos añadir un elemento raíz para poder juntarlos -->
<carta>
<palo>Corazones</palo>
<numero>7</numero>
</carta>

<carta>
<carnes>
<filete_de_ternera precio="12.95"/>
<solomillo_a_la_pimienta precio="13.60"/>
</carnes>
<pescados>
<lenguado_al_horno precio="16.20"/>
<merluza_en_salsa_verde precio="15.85"/>
</pescados>
</carta>
</ejemplo>
Probar en el navegador

Como se puede observar, al fusionar los dos documentos en uno, tenemos un elemento <carta> que tiene varios significados dentro del documento. Esto no implica que el documento XML no sea válido, sino que a nivel semántico tenemos un elemento que significa cosas diferentes.

Si se incluyen ambos elementos <carta> en un documento XML, se origina un conflicto de nombres. Para resolverlo, se pueden utilizar espacios de nombres. Por ejemplo, escribiendo:

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

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

<e2:carta>
<e2:carnes>
<e2:filete_de_ternera precio="12.95"/>
<e2:solomillo_a_la_pimienta precio="13.60"/>
</e2:carnes>
<e2:pescados>
<e2:lenguado_al_horno precio="16.20"/>
<e2:merluza_en_salsa_verde precio="15.85"/>
</e2:pescados>
</e2:carta>

</ejemplo>
Probar en el navegador

Los espacios de nombres permiten dar un nombre único a cada elemento, indexándolos según el nombre del vocabulario adecuado. Además están asociados a un URI (Uniform Resource Identifier) que los identifica de forma única.

En el documento, las etiquetas ambigüas se sustituyen por otras en las que el nombre del elemento está precedido de un prefijo, el cual determina el contexto al que pertenece la etiqueta. El prefijo debe ir separado del nombre de la etiqueta por dos puntos (:).

Por ejemplo, supongamos que tenemos el siguiente elemento:

<palo>Corazones</palo>

Si quisiésemos añadir un prefijo e1, se indicaría de la siguiente manera:

<e1:palo>Corazones</e1:palo>

Esta etiqueta se denomina nombre cualificado. Al definir el prefijo, hay que tener en cuenta que:

  • No puede contener espacios ni caracteres especiales.
  • No puede comenzar por un dígito.

Antes de poder utilizar un prefijo de un namespace, para resolver la ambigüedad de dos o más etiquetas, es necesario declarar el espacio de nombres, es decir, asociar un índice con el URI asignado al espacio de nombres. Esto se realiza mediante un atributo especial xmlns.

La declaración debe hacerse entre el prólogo y el ejemplar de un documento XML. Por norma general, lo que se utiliza es una URL (un enlace a una web).

Los espacios de nombres pueden definirse en el elemento raíz o, directamente, en los elementos que los vayan a utilizar. Por ejemplo, los siguientes documentos definen correctamente el namespace:

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