Indice del libro

Obiettivi di apprendimento

  • capire cos'è un namespace XML e qual è il suo scopo
  • riconoscere la struttura di un namespace XML e ciò che ogni parte sta facendo
  • immaginare strutture in cui il namespace sarebbe necessario

Che cos'è un namespace?

modifica

Un namespace XML è un insieme di nomi identificati da un riferimento URI (Uniform Resource Identifier), che sono usati nei documenti XML come tipi di elementi e nomi di attributi. Gli URI sono stati usati perché sono un sistema molto conosciuto per la creazione di identificatori unici. Gli namespace sono costituiti da diverse parti tra cui nomi locali, namespace URI, prefissi e dichiarazioni. La combinazione di un nome locale e di un namespace è chiamata "nome universale". Potrebbe essere più facile pensare a un namespace come a un dizionario, cioè una fonte di definizioni per gli elementi che si usano in un documento XML.

Tutti gli schemi includono il namespace http://www.w3.org/2001/XMLSchema-instance. Si può pensare a questo come al dizionario principale a cui tutti gli schemi devono fare riferimento perché definisce gli elementi fondamentali di uno schema XML. L'indirizzo del namespace sembra un URL, ma in XML si usa il termine più ampio Uniform Resource Identifier (URI).

Poiché un documento può fare riferimento a più namespace, serve un comodo e breve modulo per fare riferimento al namespace. Uno dei moduli più usati è xsd, come illustrato di seguito.

 xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"

xlmns informa XML che si sta facendo riferimento a un namespace, e xsd indica che questa è la forma breve del namespace. Per esempio, si può usare la seguente linea di codice in uno schema XML

 <xsd:element name="item" type="xsd:string">

La riga precedente afferma che la definizione del nome dell'elemento e della stringa si trovano in "http://www.w3.org/2001/XMLSchema-instance".

Il namespace consente di utilizzare elementi descritti in schemi multipli all'interno del documento XML, quindi la forma breve dell'URI di un namespace è utile per identificare il namespace a cui ci si riferisce.

Il namespace in XML è diventata una raccomandazione del W3C nel gennaio 1999, ed è stato creato per essere un metodo abbastanza semplice per distinguere i nomi usati nei documenti XML. Lo scopo principale del namespace è fornire ai programmatori un metodo per cui prendere gli elementi e gli attributi che vogliono, tralasciando gli altri tag di cui non hanno bisogno. Questi nomi adatti ai programmatori saranno unici su internet. La raccomandazione W3C del namespace XML non definisce nient'altro che un sistema di denominazione in due parti per i tipi di elementi e gli attributi.[1]

Quando usare un namespace?

modifica

Dovrebbe essere usato principalmente per evitare conflitti di denominazione. Se non si hanno elementi o attributi duplicati nell'XML che si usa, i namespace non sono necessari. Sono invece utili se si hanno elementi o attributi duplicati. Fondamentalmente crea strutture a due parti che lo rendono unico. Invece di definire il solo elemento A, per esempio, bisogna definire l'elemento A con qualche altro tipo di identificatore. È qui che entra in gioco l'URI, che in combinazione con l'elemento o attributo crea il vostro namespace, generando quindi un nome universale.

Struttura del namespace

modifica

I namespace XML differiscono dai "namespace" convenzionalmente usati in informatica, in quanto la versione XML ha una struttura interna e non è, matematicamente parlando, un insieme.

Ecco un esempio di due dichiarazioni di namespace:

     <Organization
       xmlns:addr="http://www.example.com/addresses"
       xmlns="http://www.example.com/files">

La prima dichiarazione associa il prefisso addr all'URI "www.example.com/addresses".

La seconda dichiarazione definisce www.example.com/files come namespace predefinito. Se non c'è un prefisso definito per quell'elemento, viene applicato un namespace predefinito. Questo namespace predefinito è applicato a tutti gli elementi senza prefisso. Si noti, tuttavia, che i namespace predefiniti non si applicano direttamente agli attributi.

Come funziona?

modifica

Quando si specifica un nome universale in un documento XML, si usa un'abbreviazione basata su un prefisso opzionale associato al nome locale. Questa abbreviazione si chiama qualified name (nome qualificato) o qname. Per dichiarare un namespace XML si usa un attributo il cui nome ha il modulo

 xmlns:prefix

Questi attributi sono spesso chiamati attributi xmlnsc e il loro valore è il nome del namespace XML dichiarato. Questo è un URI. La prima forma dell'attributo (xmlns:prefix) dichiara un prefisso da associare al namespace XML. Il secondo modulo (xmlns) dichiara che il namespace specificato è il namespace XML predefinito.

Namespace e buone pratiche

modifica
  • Cercate di limitare il numero dei namespace a circa cinque per documento. Più di cinque namespace in un documento diventano ingombranti.
  • Fate distinzioni nei namespace XML solo quando ci sono delle reali distinzioni tra le cose che vengono nominate.
  • Cercate di attenervi ai documenti nei namespace normali ovunque possibile, perché sono più semplici da leggere e da elaborare.
  • Evitate di sovrascrivere frequentemente i namespace perché può causare confusione nei documenti.

Esempi d'uso del namespace

modifica

Immaginiamo di dover estrarre un indirizzo da due fonti diverse, e che l'indirizzo riportato in una fonte rimanda a un indirizzo postale, mentre l'altra fonte rimanda a un indirizzo IP del computer. Avremo bisogno di creare un namespace in modo da poter distinguere i due elementi degli indirizzi.

<!-- Documento XML con indirizzo postale -->
 <address>100 Elm St., Apt#1</address> 

<!-- Documento XML con indirizzo IP -->
 <address>172.13.5.7</address>

Come si distinguono questi elementi address nel caso in cui debbano essere combinati nello stesso documento?

Potremmo assegnare a ogni nome di indirizzo un namespace. Pertanto, viene definito in due parti, l'elemento address e il namespace XML. Ogni volta che l'elemento address viene fuori, per la sua definizione bisognerà prendere in considerazione due cose invece di una, ma questa ricerca deve essere eseguita una sola volta perché la combinazione è universalmente unica.

In questo caso, potremmo creare namespace per l'elemento address:

<Example Organization
xmlns: addr="http://www.example.com/postal_addresses"
xmlns="http://www.example.com/ip_addresses">

La prima dichiarazione associa il prefisso addr all'URI "www.example.com/postal_addresses", e la seconda dichiarazione imposta "www.example.com/ip_addresses" come namespace predefinito. Quindi, dove viene usato il prefisso addr, esso estrae l'indirizzo postale, mentre per gli altri estrae l'indirizzo IP.

Definire la localizzazione di uno schema XML

modifica

Si supponga di aver creato uno schema, example.xsd, che si trova nella stessa directory del documento XML, example.xml. Nel documento XML si indicherà la posizione dello schema con il seguente codice.

 <xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='example.xsd'>

Naturalmente, se example.xsd è memorizzato in un posto diverso dalla stessa directory di example.xml, si specifica il percorso completo.

Possibili problemi

modifica
  • Le diverse tecnologie XML elaboreranno i namespace in modo diverso. Alcuni vedranno le dichiarazioni namespace come tali e altri le vedranno solo come attributi.
  • I namespace sono una soluzione di compromesso che non soddisfa le esigenze di tutti gli utenti.
  • I namespace XML sembrano semplici a prima vista, ma possono causare confusione e creare difficoltà se non sono gestiti correttamente. Per gestire correttamente i namespace è necessario comprendere a fondo il significato, le regole e le implicazioni dei vari concetti che compongono il meccanismo dei namespace XML e attenersi costantemente a semplici convenzioni.
  • Come detto nel paragrafo sulle buone pratiche, usare più di cinque namespace può diventare pesante. Quindi, come possono le grandi organizzazioni affrontare questa difficoltà di progettazione quando c'è la necessità di avere molti namespace? Il punto è che le convenzioni di denominazione sono fondamentali per la maggior parte delle architetture dell'informazione, ma in XML sono state sviluppate solo in un secondo momento. I namespace sono quindi stati molto difficili da incorporare.
  1. Per maggiori informazioni: http://www.w3.org/TR/REC-xml-names/