Il Namespace

All’interno del linguaggio XML la struttura di ogni nodo deve essere definita a priori. Questo rende impossibile il riutilizzo dei nomi dei tag, anche se questi provengono da contesti molto differenti. Questa caratteristica del linguaggio permette una rappresentazione chiara del contesto e degli oggetti, tuttavia genera anche un elevato numero di conflitti in caso di mix di documenti XML provenienti da fonti diverse. Consideriamo due esempi, il primo documento definisce la struttura di una tabella secondo lo standard HTML, mentre il secondo definisce le caratteristiche di un tavolino.


<table>
  
<tr>
    
<td>Cella1</td>

    
<td>Cella2</td>

  </tr>

</table>


<table>
  <material>wood</material>
  <width>80</width>
  <length>50</length>
</table>

Entrambe queste definizioni sono corrette se considerate singolarmente, tuttavia se associate esse provocano un errore a causa della diversa implementazione del nodo “table”. Per evitare la formazione di errori dovuti ai conflitti nella definizione dei nomi è possibile utilizzare i prefissi e i namespace.

<h:table>
  <h:tr>
    <h:td></h:td>
    <h:td></h:td>
  </h:td>
</h:table>
<f:table>
  <f:material>wood</f:material>
  <f:width>80</f:width>
  <f:length>50</f:length>
</f:table>

In questo modo non si verificheranno più conflitti, perché adesso i tue tag “table” posseggono due nomi distinti. L’utilizzo dei prefissi rende necessaria la definizione di un namespace, in XML esso viene definito mediante l’uso dell’attributo “xmlns” che viene posizionato all’interno del tag che definisce il contesto. La definizione del namespace segue la sintassi: xmlns:prefix=”URI”.

<h:table xmlns:h="http://www.w3.org/TR/html4/">
  <h:tr>
    <h:td></h:td>
    <h:td></h:td>
  </h:td>
</h:table>

Quando un namespace viene definito all’interno di un tag padre, esso viene ereditato da tutti gli elementi figli. In alternativa a quanto visto è anche possibile definire i diversi namespace all’interno del tag radice.

<root xmlns:h="http://www.w3.org/TR/html4/" xmlns:f="http://www.w3schools.com/furniture">

<h:table>
  ...
</h:table>

<f:table>
  ...
</f:table>

L’indirizzo specificato nella definizione del namespace non viene utilizzato dal parser per acquisire informazioni, esso è utilizzato unicamente per assegnare un nome univoco al namespace, tuttavia spesso le aziende e le istituzioni utilizzano questo indirizzo per rilasciare alcune informazioni sul linguaggio, si veda ad esempio http://www.w3.org/TR/html4/.

La definizione di un namespace all’interno del tag radice secondo un differente formato ci consente di non inserire i prefissi in tutti gli elementi figli.


<table xmlns="http://www.w3.org/TR/html4/">
  
<tr>
    
<td></td>

    
<td></td>

  </td>

</table>