Come l'HTML, anche l'XML usa parentesi angolari ed e commerciale per delimitare i tag, quindi questi caratteri non possono comparire tali e quali nel contenuto testuale — il documento smette di essere XML valido e il parser si ferma con un errore invece di ignorare il problema.
Le cinque entità obbligatorie
A differenza dell'HTML, che definisce centinaia di entità con nome, la specifica XML ne richiede solo cinque:
<— al posto di<>— al posto di>&— al posto di&'— al posto dell'apice singolo'"— al posto delle virgolette doppie"
Le virgolette vanno escapate solo all'interno dei valori degli attributi, mentre < e & vanno escapati ovunque nel contenuto testuale.
Dove si vede davvero nella pratica
La Fattura Elettronica italiana (FatturaPA), obbligatoria per tutte le partite IVA, è un documento XML — e la ragione sociale di un'azienda con una "e commerciale", come "Rossi & Figli", invalida l'intera fattura se non viene escapata. Lo stesso problema si presenta nei feed RSS dei siti di notizie: un titolo con un & non escapato rompe l'intero feed per chiunque provi a leggerlo.
Perché l'XML è più rigido dell'HTML
I browser di solito tollerano HTML malformato e cercano comunque di visualizzare la pagina nonostante gli errori. I parser XML non funzionano così: una sola e commerciale o parentesi angolare non escapata invalida l'intero documento e l'elaborazione si interrompe con un errore.
Quando serve
- Preparare un testo inserito dall'utente prima di aggiungerlo a un documento XML (feed, file di configurazione, messaggi SOAP).
- Diagnosi: vedere il testo originale nascosto dietro le entità in un XML ricevuto.
- Modificare file XML a mano senza rompere la struttura del documento.
L'alternativa alle entità: la sezione CDATA
Quando un blocco di testo contiene molti caratteri speciali — un frammento di HTML o codice incorporato nell'XML — è spesso più comodo racchiuderlo in <![CDATA[...]]>, dove < e & non richiedono escaping e vengono trattati come testo normale. L'unica eccezione è la sequenza ]]>, che chiude il CDATA e quindi non può comparire all'interno del contenuto della sezione stessa.