Tutoriales de informática - Abrirllave.com

Abrirllave.com

Espacios de nombres en XML

Varios documentos XML se pueden combinar entre sí, pudiendo en estos casos coincidir el nombre de algunos elementos.

EJEMPLO Dos documentos XML podrían contener un elemento llamado "carta", pero con significados distintos.

<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>

Uso de espacios de nombres

De forma que, si se incluyen ambos elementos <carta> en un documento XML, se origina un conflicto de nombres. Para resolverlo, se pueden utilizar espacios de nombres (XML Namespaces). Por ejemplo, escribiendo:

<?xml version="1.0" encoding="UTF-8"?>
<e1:ejemplo xmlns:e1="http://www.abrirllave.com/ejemplo1"
   xmlns:e2="http://www.abrirllave.com/ejemplo2">
  
   <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>
  
</e1:ejemplo>

Sintaxis para definir un espacio de nombres

Para definir un espacio de nombres se utiliza la siguiente sintaxis:

xmlns:prefijo="URI"

En el ejemplo, obsérvese que, xmlns es un atributo que se ha utilizado en la etiqueta de inicio del elemento <ejemplo> y, en este caso, se han definido dos espacios de nombres que hacen referencia a los siguientes URI (Uniform Resource Identifier, Identificador Uniforme de Recurso):

Los prefijos definidos son e1 y e2, respectivamente. Véase que, se han añadido dichos prefijos a las etiquetas que aparecen en el documento: <e1:carta>, <e2:carta>, <e1:palo>, etc.

Los URI especificados en un documento XML no tienen porqué contener nada, su función es ser únicos. No obstante, en un URI se puede mostrar información si se considera oportuno. Véase, por ejemplo:

Definición de espacios de nombres en elementos distintos al raíz

EJEMPLO En un documento XML, los espacios de nombres pueden definirse en el elemento raíz –como acabamos de ver– o, directamente, en los elementos que los vayan a utilizar. Por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<e1:ejemplo xmlns:e1="http://www.abrirllave.com/ejemplo1">
  
   <e1:carta>
      <e1:palo>Corazones</e1:palo>
      <e1:numero>7</e1:numero>
   </e1:carta>
  
   <e2:carta xmlns:e2="http://www.abrirllave.com/ejemplo2">
      <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>
  
</e1:ejemplo>

En un documento XML es posible definir todos los espacios de nombres que se necesiten, pudiéndose mezclar –si fuese necesario– los elementos de dichos espacios de nombres.

Definición de un espacio de nombres por defecto

EJEMPLO Por otra parte, se puede definir un espacio de nombres por defecto mediante la siguiente sintaxis:

xmlns="URI"

De esta forma, tanto el elemento donde se ha definido el espacio de nombres, como todos sus sucesores (hijos, hijos de hijos, etc.), pertenecerán a dicho espacio de nombres. Por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<ejemplo xmlns="http://www.abrirllave.com/ejemplo1">
  
   <carta>
      <palo>Corazones</palo>
      <numero>7</numero>
   </carta>
    
</ejemplo>

EJEMPLO En el siguiente ejemplo, inicialmente se define un espacio de nombres por defecto para el elemento <ejemplo> y los contenidos en él. Ahora bien, posteriormente, se define un segundo espacio de nombres, que por defecto afecta al segundo elemento <carta> que aparece en el documento y a sus sucesores: <carnes>, <pescados>, <filete_de_ternera>...

<?xml version="1.0" encoding="UTF-8"?>
<ejemplo xmlns="http://www.abrirllave.com/ejemplo1">
  
   <carta>
      <palo>Corazones</palo>
      <numero>7</numero>
   </carta>

   <carta xmlns="http://www.abrirllave.com/ejemplo2">
      <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>

Cómo indicar que un elemento no pertenece a ningún espacio de nombres

EJEMPLO En un documento XML, para indicar que determinados elementos –o todos– no pertenecen a ningún espacio de nombres, se escribe el atributo xmlns vacío, es decir, xmlns="".

<?xml version="1.0" encoding="UTF-8"?>
<ejemplo xmlns="http://www.abrirllave.com/ejemplo1">
  
   <carta>
      <palo>Corazones</palo>
      <numero>7</numero>
   </carta>

   <carta xmlns="http://www.abrirllave.com/ejemplo2">
      <carnes>
         <filete_de_ternera precio="12.95"/>
         <solomillo_a_la_pimienta precio="13.60"/>
      </carnes>
      <pescados xmlns="">
         <lenguado_al_horno precio="16.20"/>
         <merluza_en_salsa_verde precio="15.85"/>
      </pescados>
   </carta>

</ejemplo>

En este caso, el elemento <pescados> y sus hijos, no pertenecen a ningún espacio de nombres.