Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

XML, usare elementi o attributi?

Considerazioni semantiche e pratiche sulla modellazione di dati con un linguaggio di markup
Considerazioni semantiche e pratiche sulla modellazione di dati con un linguaggio di markup
Link copiato negli appunti

Uno dei dubbi più frequenti che assale chi per la prima volta si accinge a definire una grammatica per un linguaggio di markup basato su XML è rappresentato dalla seguente domanda: è più conveniente definire un determinato elemento sintattico come elemento o come attributo?

La risposta a questa domanda è... che non c'è una risposta! O meglio, la risposta è un po' articolata e richiede una serie di considerazioni che spero di riuscire ad esprimere in questo articolo.

Qualche spunto dai database

La problematica è analoga a quella che si presenta in un qualsiasi processo di modellazione di dati. Ad esempio, quando si progetta un database occorre fare delle scelte modellando certe informazioni come tabelle ed altre come campi. Tutto dipende da considerazioni semantiche, cioè in base al significato che intendiamo dare a certe informazioni, e pratiche, cioè in base all'utilizzo che faremo di tali informazioni.

Non è detto che una soluzione sia universalmente valida: dipende dall'esperienza e talvolta anche dai gusti personali, e dipende anche dal tipo di utilizzo che abbiamo in mente nel momento della progettazione, anche se questo potrebbe cambiare nel tempo.

Ma vediamo in ogni caso di dare degli spunti di riflessione per indirizzare ad una scelta consapevole tra elementi ed attributi XML.

Considerazioni semantiche

Da un punto di vista semantico la scelta tra elementi ed attributi è legata al significato che vogliamo attribuire ai dati che stiamo modellando. Supponiamo di volere creare un linguaggio di markup che definisca la struttura di un libro. In particolare, definiamo il capitolo come elemento. La domanda è: come definiamo il titolo del capitolo? Come elemento, come mostrato di seguito:

<libro>
  <capitolo>
    <titolo>Il primo capitolo</titolo>
    ...
  </capitolo>
</libro>

oppure come attributo, come nell'esempio seguente:

<libro>
  <capitolo titolo="Il primo capitolo">
    ...
  </capitolo>
</libro>

In genere si tende a definire come elemento un componente della struttura che intendiamo definire e come attributo una meta-informazione sul componente.

Ad esempio, se diciamo che un libro è composto da diversi capitoli e ciascun capitolo è composto da un titolo ed una serie di paragrafi, abbiamo implicitamente qualificato il titolo come un componente del libro e probabilmente ci verrà spontaneo definirlo come elemento.

Se invece diciamo che un libro è composto da diversi capitoli e ciascun capitolo ha un titolo ed è composto da una serie di paragrafi, apparteniamo alla schiera di chi definirebbe il titolo come attributo. In questo caso, infatti, il titolo non viene visto come un componente della struttura del libro ma come una meta-informazione relativa al capitolo.

Verrebbe da dire che è una questione di gusti. Ed in parte è così. A mio parere, la cosa più importante nella modellazione dei dati è chiarire bene quale deve essere la struttura semantica di quello che vogliamo definire: quali sono i componenti essenziali della nostra struttura. Questi componenti andrebbero definiti come elementi, mentre tutto ciò che fornisce ulteriori informazioni su questi componenti dovrebbero essere definiti come attributi. In ogni caso... il condizionale è d'obbligo!

Considerazioni pratiche

Le considerazioni semantiche appena viste sono suscettibili di interpretazioni personali. Non sono tuttavia le uniche ad indirizzare la scelta di definire un dato come elemento o come attributo.

In determinate situazioni la scelta potrebbe essere guidata da considerazioni pratiche, legate cioè al modo con cui intendiamo utilizzare i dati che andiamo a modellare. Supponiamo, ad esempio, che la rappresentazione di un libro tramite il nostro linguaggio servirà per la visualizzazione a video tramite un browser sfruttando i CSS e supponiamo di aver scelto la soluzione che prevede la definizione del titolo come attributo:

<libro>
  <capitolo titolo="Il primo capitolo">
    ...
  </capitolo>
</libro>

Come facciamo a visualizzare il titolo tramite una regola CSS? Con CSS2 possiamo fare come nel seguente esempio:

capitolo:after {
  content: attr(titolo);
  display: block;
}

Ma andremmo incontro sicuramente a problemi di supporto da parte dei diversi browser. Da un punto di vista pratico probabilmente sarebbe meglio definire il titolo come un elemento ed adottare una regola di formattazione CSS più lineare.

Altre considerazioni di questo tipo che potrebbero influenzare la nostra scelta possono derivare dalla complessità di trasformazioni XSLT o di manipolazioni tramite un linguaggio di programmazione. In questo caso la praticità di una soluzione implementativa può orientare la scelta di definire un'informazione come elemento o come attributo.

Conclusioni

Non esiste una regola d'oro che ci consenta di stabilire se definire un dato come elemento o come attributo. La scelta è affidata un po' al buon senso ed un po' all'esperienza. In ogni caso è opportuno avere chiaro a cosa servirà il linguaggio che andiamo a definire. Scelte semanticamente eleganti potrebbero rivelarsi un incubo dal punto di vista pratico, come d'altro canto una soluzione troppo mirata a semplificare le cose in fase di elaborazione potrebbe dare origine ad un modello confuso e di difficile interpretazione.

Ti consigliamo anche