back to top

XML namespaces: cosa sono e come funzionano

Nella visione XML, i tipi di documenti si mescolano e si fondono tra loro in maniera complessa. Lo stesso documento potrebbe avere alcuni elementi definiti in un vocabolario ed altri in un altro.

Un esempio comune è un documento XML di valori di borsa che adopera i tag di HTML per definire gli elementi di testo, ed un insieme di tag specifici per gli elementi di borsa.

Oppure anche un documento che contiene elementi strutturali di un vocabolario principale, e un payload che è a sua volta un documento XML totalmente diverso (XSLT ed HTML, SOAP, ecc.).

I problemi sono identificare esattamente l’ambito di ciascun elemento, conciliare la presenza di elementi definiti in uno di più vocabolari, e soprattutto conciliare la presenza di elementi definiti con lo stesso nome in più vocabolari diversi.

I namespace in XML si propongono per risolvere questi problemi. XMLNamespaces è una recommendation di W3C del 1999.

Supponiamo che una libreria voglia mettere il proprio database su Web:

<h:html xmlns:mia="http://www.mia.it/libri”
    xmlns:h="http://www.w3.org/HTML/1998/html4">
<h:head><h:titolo>Sezione Informatica</h:titolo></h:head>
<h:body>
    <mia:Sezione Informatica>
    <mia:titolo>Guida ad ASP.NET</mia:titolo>
        <h:table>
            <h:tr><h:td>Autore</h:td> <h:td>Prezzo</h:td>
                <h:td>Pagine</h:td> <h:td>Data</h:td> </h:tr>
        <h:tr>
            <h:td><mia:autore>Matthew MacDonald</mia:autore></h:td>
            <h:td><mia:prezzo>56</mia:prezzo></h:td>
            <h:td><mia:pagine>864</mia:pagine></h:td>
            <h:td><mia:editore>Mondadori</mia:editore></h:td>
            </h:tr>
        </h:table>
    </mia:Sezione Informatica>
</h:body>
</h:html>

Ogni nome di elemento o attributo del documento XML è preceduto da un prefisso che ne specifica l’ambito. Il prefisso è separato da il carattere ‘:’ dal nome dell’elemento o dell’attributo.

L’attributo predefinito "xmlns" serve per introdurre i prefissi usati dai namespace del documento. Il valore dell’attributo è un URI che non ha nessun valore dichiarativo, ma solo informativo. Si usa un URI perché si sa già che è unico su Internet.

Poiché ogni namespace userà un prefisso diverso, è possibile capire quali elementi appartengono all’uno e all’altro, e di evitare qualunque problema di collisione.

Un nome (di elemento o di attributo) che contiene prefisso di namespace e nome locale viene detto "nome qualificato".

Ovviamente la natura specifica del prefisso è irrilevante. Conta solo che sia associato ad un URI ben preciso. Nella dichiarazione xmlns si pone il nome del prefisso che si intende usare nel corso del documento per gli elementi definiti in quel namespace.

L’assenza di tale prefisso in xmlns indica la presenza di un namespace di default, per cui tutti i nomi privi di prefisso si debbono intendere appartenenti a quel namespace.Mettendo HTML come namespace di default, è tutto un po’ più leggibile, riprendendo l’esempio di sopra diventa:

<html xmlns:mia="http://www.mia.it/libri”
      xmlns="http://www.w3.org/HTML/1998/html4">
<head><titolo>Sezione Informatica</titolo></head>
<body>
  <mia:Sezione Informatica>
    <mia:titolo>Guida ad ASP.NET</mia:titolo>
      <table>
            <tr><td>Autore</td> <td>Prezzo</td>
                <td>Pagine</td> <td>Data</td></tr>
        <tr>
            <td><mia:autore>Matthew MacDonald</mia:autore></td>
            <td><mia:prezzo>56</mia:prezzo><td>
            <td><mia:pagine>864</mia:pagine><td>
            <td><mia:editore>Mondadori</mia:editore></td>
        </tr>
      </table>
  </mia:Sezione Informatica>
<body>
<html>

La dichiarazione di namespace può essere fatta ovunque e ha scope solo all’interno dell’elemento in cui è stata fatta. Possono essere fatte più definizioni di namespace di default, quella interna ha "ovviamente" precedenza.

Il namespace contiene tre partizioni di nomi:

  • All Element Types Partition:contiene tutti i nomi degli elementi definiti nel namespace; ogni nome è unico in questa partizione;
  • The Global Attribute Partition:contiene i nomi di tutti gli attributi definiti come globali, ovvero usabili ovunque sia definito il namespace;
  • The Per-Element-Type Partitions:ogni nome della All Element Types Partition ha un namespace locale dove sono definiti i nomi degli attributi non qualificati ciò significa che gli attributi propri di un elemento non debbono ripetere il prefisso di namespace:
<html:IMG html:src="image.gif" html:alt="scritta"/>

è equivalente a

<html:IMG src="image.gif" alt="scritta"/>

I namespace sono stati introdotti dopo i DTD, e quindi esprimere namespace nei DTD non è facile. L’unico modo è di esprimere come nomi validi i nomi qualificati, bloccando il prefisso:

<!DOCTYPE a:item [
  <!ELEMENT a:item (a:titolo, a:editore)>
  <!ATTLIST a:item
            xmlns:a CDATA #FIXED "http://www.mieilibri.com">
  <!ELEMENT a:titolo (#PCDATA) >
  <!ELEMENT a:editore (#PCDATA) >
  ]>
  <a:item xmlns:a="http://www.mieilibri.com">
           <a:titolo>DTD-Namespaces croce e delizia</a:titolo>
           <a:editore>Ipiùbeilibrichecisono</a:editore>
  </a:

L’etichetta di un namespace è solo un nome. Il namespace non è un vocabolario esplicito, raccontato in qualche forma, ma solo un modo per differenziare nomi dello stesso documento. Gli URI dei namespace vengono usati come identificatori. Ovviamente un URI relativo viola il concetto di identificatore assoluto. La raccomandazione W3C non dice niente, per questo è meglio evitare di usare URN relativi come etichette di namespace.

Pubblicitร 
Articolo precedente
Articolo successivo