Tutti gli articoli

XML Entities: escapare i caratteri nei documenti XML

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:

  • &lt; — al posto di <
  • &gt; — al posto di >
  • &amp; — al posto di &
  • &apos; — al posto dell'apice singolo '
  • &quot; — 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.

Prova lo strumento