I nodi

Il corpo di un documento XML è costituito da tutto il codice presente dopo la prima riga d’intestazione, i nodi di un documento XML vengono rappresentati mediante parole chiave racchiuse all’interno di due parentesi angolari opposte.

<nodo></nodo>

I nodi XML si differenziano in nodi “pieni”, e nodi “vuoti”. I nodi pieni (con quello dell’esempio precedente) vengono aperti e chiusi da due tag distinti caratterizzati dal medesimo nome, inoltre all’interno del tag di chiusura deve essere sempre inserito il carattere di slash “/”. Questi nodi vengono utilizzati per contenere dell’informazione testuale, oppure altri tag in forma nidificata.

<nodo>informazione</nodo>

I tag “vuoti” vengono utilizzati per memorizzare diverse informazioni mediante l’utilizzo di attributi, gli attributi devono essere caratterizzati da un nome univoco (all’interno del medesimo tag). Anche i tag “vuoti” devono sempre essere richiusi mediante un carattere di slash “/”.

<nodo_vuoto attributo="valore"/>

Gli attributi possono essere inseriti anche all’interno dei tag “pieni”.

<nodo attributo="valore">informazione</nodo>
<nodo_vuoto attributo="valore" attributo2="valore2"/>

Ogni documento XML deve essere ben formattato (well formed) secondo alcune regole precise:

  1. Ogni documento XML deve contenere un unico elemento radice (seme) che a sua volta deve contenere tutti gli altri elementi del documento. All’esterno dell’elemento radice è possibile trovare unicamente le direttive di elaborazione (come il riferimento alla versione) e i commenti;
  2. Ogni elemento presente all’interno del documento deve possedere un tag di chiusura;
  3. Gli elementi devono essere correttamente nidificati, questo significa che i tag di chiusura devono sempre seguire l’ordine inverso dei rispettivi tag di apertura;
  4. Il linguaggio XML è un linguaggio case sensitive, ovvero un linguaggio che fa distinzione tra lettere maiuscole e minuscole, i nomi dei tag e gli attributi devono coincidere nei tag di apertura e di chiusura anche in relazione a questo aspetto;
  5. Gli attributi devono essere sempre inseriti nel tag di apertura e i loro valori devono sempre essere racchiusi tra apici doppi o singoli.

Il seguente documento non è conforme alla prima regola enunciata per lo standard:

<?xml version="1.0" ?>
<ricetta></ricetta>
<ricetta></ricetta>

Il seguente invece lo è:

<?xml version="1.0" ?>
<ricettario>
  <ricetta></ricetta>
  <ricetta></ricetta>
</ricettario>

Il seguente documento non è conforme alla seconda e alla terza regola enunciata per lo standard:

<?xml version="1.0" ?>
<ricettario>
  <ricetta>
    <titolo nome="Lasagne alla bolognese">
  </ricetta>
  <ricetta>
    <titolo nome="Gnocchi al pesto">
  </ricettario>
</ricetta>

Il seguente invece lo è:

<?xml version="1.0" ?>
<ricettario>
  <ricetta>
    <titolo nome="Lasagne alla bolognese"/>
  </ricetta>
  <ricetta>
    <titolo nome="Gnocchi al pesto"/>
  </ricetta>
</ricettario>

Il seguente documento non è conforme alla quarta e alla quinta legge enunciata per lo standard:

<?xml version="1.0" ?>
<ricettario>
  <RICETTA num="1">
    <titolo nome="Lasagne alla bolognese"/>
  </ricetta>
  <ricetta>
    <titolo nome="Gnocchi al pesto">
  </ricetta num="2">
</ricettario>

Il seguente invece lo è:

<?xml version="1.0" ?>
<ricettario>
  <ricetta num="1">
    <titolo nome="Lasagne alla bolognese"/>
  </ricetta>
  <ricetta num="2">
    <titolo nome="Gnocchi al pesto"/>
  </ricetta>
</ricettario>

A differenza di altri linguaggi con struttura simile, come il linguaggio HTML, in XML non esiste un set predefinito di tag inseribili all’interno dei nostri documenti, il linguaggio ci riserva la possibilità di definire e utilizzare qualunque tag necessitiamo. Il nome di un tag può essere composto di lettere, numeri e dai caratteri ‘_’ e ‘-‘ (per quanto sarebbe meglio evitare l’utilizzo di quest’ultimo carattere). Il nome del tag deve sempre iniziare con una lettera, oppure con il carattere di underscore, inoltre esso non può contenere spazi, oppure la sequenza di caratteri “XML” (“xml”, “Xml”, ecc.). I caratteri speciali come ‘è’, ‘ò’ o ‘á’ sarebbero ammessi dallo standard, ma purtroppo essi non sono riconosciuti da moltissimi software e ambienti di sviluppo.

All’interno di un nodo XML è possibile utilizzare tutti i caratteri offerti dal set in uso, tuttavia l’utilizzo di particolari caratteri, detti speciali, può generare errori in fase di lettura.

<testo attributo='l'utilizzo di certi carattere puo' provocare degli errori'>
   il simbolo < indica minore di
</testo>

Per arginare queste situazioni di pericolo in XML e in altri linguaggi simili sono stati introdotti alcuni oggetti “speciali”, chiamati entità, che consentono di rappresentare altri caratteri.

Entità Valore
&amp; &
&lt; <
&gt; >
&quot;
&apos;

Ad esempio:

<testo attributo='l&amp;apos;utilizzo di certi carattere puo&amp;apos; provocare degli errori'>
   il simbolo &amp;lt; indica minore di
</testo>

In determinate circostanze tuttavia, l’utilizzo ripetuto delle entità sopra descritte potrebbe rendere difficoltosa la lettura del nostro documento XML. Quando le stringhe di testo da rappresentare sono molte è possibile utilizzare una sezione “CDATA” (Character DATA) per creare un blocco di testo che verrà sempre considerato come tale. Per rappresentare una sezione CDATA dobbiamo utilizzare il seguente formato:

<![CDATA[ testo ]]>

Ad esempio il seguente documento XML:

<guida titolo="guida XML">
  <testo>I tag XML vengono sempre aperti dal carattere &amp;lt; e chiusi dal carattere &amp;gt;</testo>
</guida>

Può essere così rappresentato:

<guida titolo="guida XML">
  <testo>
    <![CDATA[
      I tag XML vengono sempre aperti dal carattere < e chiusi dal carattere >
    ]]>
  </testo>
</guida>

Come già succede in quasi tutti i linguaggi di programmazione anche in XML è possibile inserire dei commenti utilizzando i “comment nodes”, definiti mediante i caratteri ““.

<!-- corpo del commento -->

Gli attributi

Gli attributi vengono utilizzati per memorizzare più informazioni all’interno del medesimo nodo, ad esempio, riprendendo il precedente esempio del ricettario possiamo utilizzare gli attributi per descrivere il tempo di preparazione di una ricetta, oppure per specificare la lista degli ingredienti.

<ricetta>
  <titolo>Lasagne alla bolognese</titolo>
  <tempo_praparazioe tempo="100" unita="minuti"/>
  <ingredienti>
    <ingrediente nome="Parmiggiano reggiano" quantita="250" unita="grammi"/>
    <ingrediente nome="Carote" quantita="50" unita="grammi"/>
    <ingrediente nome="Cipolle" quantita="60" unita="grammi"/>
    <ingrediente nome="Sedano" quantita="50" unita="grammi"/>
    <!-- … -->
  </ingredienti>
</ricetta>

Il medesimo documento potrebbe essere rappresentato utilizzando una forma alternativa, anche se forse più macchinosa.

<ricetta>
  <titolo>Lasagne alla bolognese</titolo>
  <tempo_praparazioe>
    <tempo>100</tempo>
    <unita>minuti</unita>
  </tempo_preparazione>
  <ingredienti>
    <ingrediente>
      <nome>Parmigiano reggiano</nome>
      <quantita>250</quantita>
      <unita>grammi</unita>
    </ingrediente/>
    <!-- … -->
  </ingredienti>
</ricetta>

Non esiste una regola universale che stabilisce quando sia meglio usare un tag pieno e quando invece sia meglio utilizzare gli attributi, in genere si tende a considerare le necessità dell’applicazione. Ad esempio una data potrebbe essere rappresentata in modi diversi (e tutti leciti):

<data>17/11/2015</data>

<!-- oppure -->
<data>
  <giorno>17</giorno>
  <mese>11</mese>
  <anno>2015</anno>
</data>

<!-- oppure -->
<data valore="17/11/2015"/>