Share |

domenica 31 gennaio 2010

XML:Usare Entità Predefinite e Customizzate

Capita di riceve documenti XML well-formed ma che purtroppo non passano la fase di parsing perchè al loro interno sono stati utilizzati caratteri vietati, anziché le rispettive entità XML. Un esempio di ciò che intendo potrebbe essere la situazione seguente:

<nodo> 5 < 10 </nodo>

Dal punto di vista formale il nodo è corretto, detto appunto well-formed, ma al suo interno è presente il carattere '<' che essendo vietato dalla grammatica XML genera errori in fase di parsing.

Il suddetto carattere (<) deve essere sostituito dalla sequenza '&lt;' che e' una delle 5 entità predefinite che rimpiazzano altrettanti caratteri significativi e riservati per il linguaggio XML.

Cosa sono le Entità?

Le entita' sono delle scorciatoie da utilizzare al posto dei riferimenti numerici (ASCII) con i quali sarebbe possibile esprimere ogni carattere digitabile: tornando al nostro carattere non utilizzabile (<), questo potrebbe essere anche sostituito dalla sequenza '&#62;', cioè dal valore decimale con cui quel carattere viene rappresentato in codice macchina.

Ovviamente, l'utilizzo delle entità facilita non poco le cose rispetto a quello che sarebbe altrimenti lavorare con i riferimenti numerici.

Entita' Predefinite

Ho accennato precedentemente all'esistenza di 5 entita' XML predefinite, ma quali sono?

Entità Predefinite
Entita'Riferimento nel TestoSignificato
lt&lt;minore di
gt&gt;maggiore di
amp&amp;e commerciale (&)
apos&apos;apostrofo (')
quot&quot;doppie virgolette (")

E' necessario specificare che differentemente dai caratteri '<', '>' e '&', che sono sempre vietati all'interno di tutto il documento XML, i caratteri ' e " devono essere obbligatoriamente sostituiti dalle rispettive entita' solo se presenti nel valore di un attributo delimitato dallo stesso carattere, come nel seguente esempio:

<nodo attributo='l'apostrofo'/>

Entità Customizzate

Siccome 5 entità predefinite potrebbero non essere sufficienti, XML ci consente di crearne altre personalizzate, o customizzate.

Possiamo infatti creare infinite scorciatoie per sostituire i caratteri nei nostri documenti, per esempio mi viene in mente il carattere della moneta EURO '€': se ogni volta per utilizzarlo all'interno di un documento XML dovessimo ricordarci il suo riferimento numerico (#8364;) saremmo quanto meno a rischio neuro. :)

Come possiamo definire una nuova entità con cui sostituire facilmente ogni volta il carattere dell'EURO?

Ci viene in aiuto la sintassi DTD (Document Type Definition): questa ci permette di dichiarare, all'interno del documento o esternamente, una definizione DOCTYPE a cui fare riferimento per rendere agevole la sostituzione di con &#8364; nella fase di creazione del XML.

<!DOCTYPE portafoglio[
   <!ENTITY eur "&amp;#8364;">
]>   
<portafoglio>
   <lunedi>33 &eur; </lunedi>
   <martedi>13 &eur; </martedi>
   .......
</portafoglio>

E' chiaro che è possibile inventare entità per esprimere qualunque tipo di testo, carattere o stringa che sia.

Per esempio, abbiamo la lista delle opere di un autore il cui nome e' lunghissimo e deve essere ripetuto per ogni opera?

In questo caso, potrebbe tornare utile la creazione di una entità di questo tipo:

<!DOCTYPE opere[
   <!ENTITY aut "Mirko Agrati">
]>  

E ogni volta che devo scrivere l'autore faccio riferimento a '&aut;'. Semplice e comodo, no?

Alla prossima, MA.

0 commenti:

Posta un commento

Non ti è chiaro qualcosa?
No problem, posta il tuo dubbio ;)

..... e ricordati di firmarlo!