# 5 - I namespace

L'insieme di tutti i tipi di elementi e dei nomi di attributo di un linguaggio markup prende il nome di vocabolario markup . Spesso puo' risultare comodo costruire documenti xml che includono vocabolari markup definiti per altri sistemi software e da questi utilizzati. Quando un vocabolario markup si rivela disponibile e appropriato per un determinato documento xml o per una classe di documenti, e' sempre piu' opportuno utilizzarlo piuttosto che inventare un nuovo insieme di tipi di elementi e di nomi di attributo. Per esempio il vocabolario markup html viene utlizzato di frequente nei documenti xml.

Spesso conviene unire due documenti xml, in particolare quando un documento xml definisce il proprio vocabolario markup e utilizza anche uno o piu' vocabolari markup aggiuntivi. Per esempio, si immagini di dover definire un linguaggio markup xml per un catalogo di mobili con i tag `<chair>`, `<sofa>` e `<table>`. Il documento del catalogo deve includere anche molte tabelle differenti relative ai mobili, ai tipi di legno, alle finiture e ai prezzi. E' opportuno utilizzare tag di tabella html per definire le tabelle, invece di dover inventare un nuovo vocabolario apposito.

Il problema evidente causato dall'utlizzo di piu' vocaboli per lo stesso documento e' l'eventuale conflitto tra i nomi definiti in vocabolari diversi. Tale conflitto si potrebbe verificare per esempio se si avesse un tag `<table>` per una categoria di mobili e un tag omonimo html per le tabelle di informazione. Chiaramente i sistemi software che elaborano i documenti xml devono essere in grado di riconoscere senza ombra di dubbio i tipi di elementi e i nomi di attributo. Per affrontare il problema W3C ha sviluppato uno standard pe ri namespace XML (http://www.w3c.org/TR/REC-xml-names).

- Un namespace xml e' un insieme di nomi utilizzati nei documenti xml come tipi di elemento e nomi di attributo.
- Il nome di un namespace di solito ha la forma di un URI, ma non necessariamente perche' si tratta di un indirizzo Internet, bensi' perche' in quetso modo il nome e' unico.
- Un namespace per gli elementi della gerarchia radicata in un elemento particolare viene dichiarato come valore dell'attributo `xmlns`.
- E' sufficiente includere la dichiarazione la prima volta che si utilizza l’elemento; la forma di una dichiarazione di namespace per un elemento e' la seguente:

  `<nome_elemento xmlns[:prefisso] = URI>`
  Le parentesi quadre indicano che il loro contenuto e' facoltativo. Se viene incluso, il prefisso e' il nome che deve venire assegnato ai nomi del namespace dichiarato . Il prefisso viene utilizzato per due motivi:
  1. il primo e' che un URI e' troppo lungo per venire digitato assieme ad ogni nome utlizzato dal namespace;
  2. il secondo motivo e' che gli URI includono caratteri non validi in XML.

  Per esempio, si supponga di avere la seguente dichiarazione namespace:

  `<birds xmlns:bd = "http://www.audubon.org/names/species">`

  All'interno dell'elemento `birds`, che include tutti i propri elementi figli, si deve aggiungere il prefisso `bd` ai nomi del namespace, come nell'esempio:

  `<bd:lark> ... </bd:lark>`
- Se un elemento contiene piu' di una dichiarazione namespace, tali dichiarazioni vengono dichiarate nel modo seguente:

  `<birds xmlns:bd = "http://www.audubon.org/names/species"
  xmlns:html = "http://www.w3c.org/TR/REC-html40">`

  In questo esempio si e' aggiunto il namespace standard HTML 4.0 all'elemento `birds`.
- Una dichiarazione namespace di un elemento puo' essere utilizzata per dichiarare un namespace predefinito. Questa operazione e' possibile semplicemente lasciando fuori il prefisso dalla dichiarazione, come nell'esempio:

  `<birds xmlns = "http://www.audubon.org/names/species">`
  I nomi dei namespace predefiniti possono essere utilizzati senza prefisso. L’elemento contiene la dichiarazione di uno spazio dei nomi senza prefisso associato. In quanto tale, lo spazio dei nomi viene utilizzato per l’elemento `birds` e tutti i relativi elementi secondari, ma per nessun altro elemento oltre `birds`.
- Se un documento XML utilizza una DTD e un nome con prefisso, la DTD deve definire un elemento esattamente con lo stesso prefisso e lo stesso nome.
- In alternativa, per poter utilizzare uno spazio dei nomi in documento XML, e' possibile includere una dichiarazione dello spazio dei nomi nel prologo del documento:

  `<?xml version="1.0"?>
  <?xml:namespace ns=http://inventory/schema/ns prefix="inv"?>
  <?xml:namespace ns=http://wildflowers/schema/ns prefix="wf"?>
  <PRODUCT>
  <PNAME>Test1</PNAME>
  <inv:quantity>1</inv:quantity>
  <wf:price>323</wf:price>
  <DATE>6/1</DATE>
  </PRODUCT>`

  in questo esempio di codice, i prefissi vengono utilizzati per identificare elementi appartenenti allo spazio dei nomi selezionato. Si otterranno in questo modo nomi univoci, ma anche la conservazione del valore semantico dei nomi. Gli elementi `inv:quantity` e `wf:price` contengono nomi completamente qualificati che risulteranno univoci indipendemente dalla posizione in cui sono stati utilizzati. Il prefisso è parte del nome dell’elemento e deve essere sempre incluso in modo tale da indicare che l’elemento appartiene allo spazio dei nomi.