Igual que en HTML, en XML los signos de menor-que, mayor-que y el ampersand marcan el inicio y fin de las etiquetas, así que no pueden aparecer tal cual dentro del contenido de texto — el documento deja de ser XML válido y el analizador se detiene con un error en lugar de ignorar el problema.
Las cinco entidades obligatorias
A diferencia de HTML, que define cientos de entidades con nombre, la especificación XML solo exige cinco:
<— en lugar de<>— en lugar de>&— en lugar de&'— en lugar de la comilla simple'"— en lugar de la comilla doble"
Las comillas solo hay que escaparlas dentro de valores de atributo, mientras que < y & deben escaparse en cualquier contenido de texto.
Dónde aparece esto en la práctica
La factura electrónica en España (Facturae) y el CFDI mexicano se basan en XML, así que el nombre de una empresa con un ampersand — "García & Asociados" — invalida el documento entero si no está escapado. Lo mismo ocurre en los feeds RSS de cualquier medio: un titular con un & sin escapar rompe la lectura del feed completo para todos los suscriptores.
Por qué XML es más estricto que HTML
Los navegadores suelen tolerar HTML mal formado e intentan mostrar la página de todas formas. Los analizadores de XML no: un solo ampersand o corchete angular sin escapar invalida todo el documento y el procesamiento se detiene con un error.
Cuándo se necesita esto
- Preparar texto introducido por el usuario antes de insertarlo en un documento XML (feeds, configuraciones, mensajes SOAP).
- Depuración: ver el texto real oculto detrás de las entidades en un XML recibido.
- Editar archivos XML a mano sin romper la estructura del documento.
La alternativa a las entidades: la sección CDATA
Cuando un bloque de texto contiene muchos caracteres especiales — un fragmento de HTML o código incrustado en XML — suele ser más práctico envolverlo en <![CDATA[...]]>, donde < y & no necesitan escaparse y se tratan como texto normal. La única excepción es la secuencia ]]>, que cierra la sección CDATA y por tanto no puede aparecer dentro de su propio contenido.