¿Qué caracteres necesito para escapar en documentos XML?

¿Qué caracteres deben escaparse en los documentos XML o dónde puedo encontrar esa lista?

preguntado el 07 de julio de 09 a las 09:07

Ejemplo: <company>AT&amp;T</company> -

Ver Escape XML simplificado a continuación para obtener una guía concisa y fácil de recordar que he destilado de fuentes primarias (W3C Extensible Markup Language (XML) 1.0 (Quinta edición)). -

10 Respuestas

Si usa una clase o biblioteca apropiada, ellos harán el escape por usted. Muchos problemas de XML se deben a la concatenación de cadenas.

Caracteres de escape XML

Solo hay cinco:

"   &quot;
'   &apos;
<   &lt;
>   &gt;
&   &amp;

Los caracteres de escape dependen de dónde se utilice el carácter especial.

Los ejemplos se pueden validar en el Servicio de Validación de marcado W3C.

Texto

La forma segura es escapar de los cinco caracteres del texto. Sin embargo, los tres personajes ", ' y > no es necesario que se escape en el texto:

<?xml version="1.0"?>
<valid>"'></valid>

Atributos

La forma segura es escapar de los cinco caracteres en atributos. sin embargo, el > el carácter no necesita escaparse en los atributos:

<?xml version="1.0"?>
<valid attribute=">"/>

El ' el carácter no necesita ser escapado en atributos si las comillas son ":

<?xml version="1.0"?>
<valid attribute="'"/>

Del mismo modo, el " no es necesario escapar en los atributos si las comillas son ':

<?xml version="1.0"?>
<valid attribute='"'/>

Comentarios

Los cinco personajes especiales no debe se escapa en los comentarios:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

Los cinco personajes especiales no debe ser escapado en CDATA secciones:

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

Instrucciones de procesamiento

Los cinco personajes especiales no debe ser escapado en las instrucciones de procesamiento XML:

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML frente a HTML

HTML tiene su propio conjunto de códigos de escape que cubren muchos más personajes.

Respondido el 26 de enero de 20 a las 13:01

@Pacerier, le ruego que no escriba su propio código de escape XML / HTML. Utilice una función de biblioteca o se perderá un caso especial. - Jason

También para los saltos de línea que necesita utilizar y para tabulación, si necesita estos caracteres en un atributo. - radistao

Si va a buscar / reemplazar en estos, recuerde hacer el & reemplazo antes que los demás. - Doug

@Doug Estaba a punto de mencionar exactamente lo mismo, o de lo contrario todos los demás caracteres reemplazados se corromperán y cosas como &quot; será cambiado a &amp;quot; - jerry esquivar

De Wikipedia: "Todos los caracteres Unicode permitidos se pueden representar con una referencia de carácter numérico". Entonces hay muchos más de 5. - tim cooper

Tal vez esto ayude:

Lista de referencias de entidades de caracteres XML y HTML:

En documentos SGML, HTML y XML, las construcciones lógicas conocidas como datos de caracteres y valores de atributos consisten en secuencias de caracteres, en las que cada carácter puede manifestarse directamente (representándose a sí mismo), o puede ser representado por una serie de caracteres denominada referencia de carácter, de los cuales hay dos tipos: una referencia de carácter numérico y una referencia de entidad de carácter. Este artículo enumera las referencias a entidades de caracteres que son válidas en documentos HTML y XML.

Ese artículo enumera las siguientes cinco entidades XML predefinidas:

quot  "
amp   &
apos  '
lt    <
gt    >

Respondido el 07 de junio de 12 a las 19:06

Según las especificaciones del World Wide Web Consortium (w3C), hay 5 caracteres que no deben aparecer en su forma literal en un documento XML, excepto cuando se utilizan como delimitadores de marcas o dentro de un comentario, una instrucción de procesamiento o una sección CDATA. En todos los demás casos, estos caracteres deben reemplazarse utilizando la entidad correspondiente o la referencia numérica de acuerdo con la siguiente tabla:

Personaje originalReemplazo de entidad XMLReemplazo numérico XML
<                              <                                                                        
>                              >                                   >                                    
"                               "                               "                                    
&                              Y                               Y                                    
'                               '                               '                                    

Tenga en cuenta que las entidades mencionadas anteriormente se pueden utilizar también en HTML, con la excepción de ', que se introdujo con XHTML 1.0 y no se declara en HTML 4. Por este motivo, y para garantizar la retrocompatibilidad, la especificación XHTML recomienda el uso de ' preferiblemente.

Respondido 03 Jul 13, 13:07

XML predefine esas cinco entidades, pero NO especifica en absoluto que no puede usar ninguno de esos cinco caracteres en su forma literal. <y & deben escaparse en todas partes (excepto CDATA). "y 'solo tienen que escaparse en los valores de atributo, y solo si el carácter de comillas correspondiente es el mismo. Y> en realidad nunca tiene que escaparse. - Shaun McCance

Como se escribió anteriormente, <> "& 'no tiene que escaparse cuando se usa como delimitadores de marcado o dentro de un comentario, una instrucción de procesamiento o una sección CDATA. Es decir, cuando usa <> como una etiqueta XML, no lo escapa. . Lo mismo para un comentario (¿escaparías de un & en una línea comentada de un archivo XML? No es necesario, y tu XML sigue siendo válido si no lo haces). Esto se especifica claramente en el recomendaciones oficiales para XML por W3C. - Albz

@ShaunMcCance > debe escaparse si sigue ]] dentro del contenido, a menos que esté destinado a ser parte del ]]> delimitador que indica el final de una sección CDATA. - Lee D

No para ser un nigromante, pero @Albz se equivoca al decir que estos personajes DEBEN estar autorizados en el contenido. Consulte la sección 2.4 en w3.org/TR/REC-xml/#NT-CharData. La versión TL; DR de eso es que en el contenido del elemento chardata, & y <siempre deben estar autorizados. El carácter> PUEDE estar autorizado, aunque DEBE estarlo cuando aparece en la cadena literal “]]>” porque de lo contrario se leerá como el final de una sección CDATA. Para comillas simples y comillas dobles, puede escapar si lo desea. Eso es todo, para los elementos internos de chardata. Otros componentes de XML tienen otras reglas. - Chris

Los caracteres de escape son diferentes para las etiquetas y los atributos.

Para etiquetas:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

Para atributos:

" &quot;
' &apos;

Desde Datos de caracteres y marcado:

El carácter comercial (&) y el corchete de ángulo izquierdo (<) no deben aparecer en su forma literal, excepto cuando se utilizan como delimitadores de marcado, o dentro de un comentario, una instrucción de procesamiento o una sección CDATA. Si se necesitan en otro lugar, deben escaparse utilizando referencias de caracteres numéricos o las cadenas "&" y "<" respectivamente. El corchete de ángulo recto (>) puede representarse mediante la cadena ">" y, por motivos de compatibilidad, debe escaparse mediante ">" o una referencia de carácter cuando aparezca en la cadena "]]>" en el contenido, cuando La cadena no marca el final de una sección CDATA.

Para permitir que los valores de atributo contengan comillas simples y dobles, el apóstrofo o el carácter de comillas simples (') se pueden representar como "'" y el carácter de comillas dobles (") como" "".

Respondido el 17 de diciembre de 19 a las 19:12

Esto implica que para los atributos solo se deben escapar las comillas, pero eso es además de los otros tres caracteres: EU G

Nueva respuesta simplificada a una pregunta antigua y frecuente ...

Escape XML simplificado (priorizado, 100% completo)

  1. Siempre (90% importante de recordar)

    • Escapar < as &lt; a menos que < está comenzando un <tag/>.
    • Escapar & as &amp; a menos que & está comenzando un &entity;.
  2. Valores de atributo (9% importante de recordar)

    • attr=" 'Comillas simples' están bien entre comillas dobles."
    • attr=' "Doble comillas" están bien entre comillas simples.'
    • Escapar " as &quot; y ' as &apos; de otra manera.
  3. Comentarios, CDATA y Instrucciones de procesamiento (0.9% importante de recordar)

    • <!-- En un radio de comentarios --> nada tiene que escaparse pero no -- Se permiten cadenas.
    • <![CDATA[ En un radio de CDATA ]]> nada tiene que escapar, pero no ]]> Se permiten cadenas.
    • <?PITarget En un radio de inhibidores de la proteasa ?> nada tiene que escapar, pero no ?> Se permiten cadenas.
  4. Esoterica (0.1% importante de recordar)

    • Escapar ]]> as ]]&gt; a menos que ]]> está terminando una sección CDATA.
      (Esta regla se aplica a los datos de caracteres en general, incluso fuera de una sección CDATA).

Respondido 01 ago 19, 15:08

Otra regla que vale la pena señalar: ]]> debe ser escapado como ]]&gt;, incluso cuando no está en una sección CDATA. La forma más fácil de lograrlo puede ser siempre escapar > as &gt;. - Michael Kay

Gracias, @MichaelKay. He incorporado su útil nota sobre ]]> pero eligió relegarlo a lo esotérico en lugar de sugerir que > siempre ser escapado (que no tiene por qué ser, como usted sabe). Mi objetivo aquí es hacer que las reglas de escape XML fácilmente recordado y 100% exacto. - kjhughes

Las respuestas anteriores, incluida una mención aceptada, los cinco caracteres deben escaparse dentro de los atributos. ¿Tiene alguna referencia al estándar XML para respaldar lo que está diciendo, ya que su respuesta, lógicamente, parece ser la correcta? - susi romano

@RomanSusi: Sí, muchas otras respuestas contienen errores o generalizaciones excesivas ("La forma segura ...") basadas en rumores, malas interpretaciones o malentendidos del XML BNF oficial. Mi respuesta es (a) 100% justificada por la Recomendación XML del W3C; vea las numerosas referencias vinculadas al BNF oficial, y (b) organizadas en una progresión concisa, lógica y fácil de recordar de esos requisitos. - kjhughes

@RomanSusi: La declaración específica de que "los cinco caracteres deben escaparse dentro de los atributos" es una guía descuidada que no está respaldada por la regla oficial de BNF para AttValue citado en mi respuesta a través de un enlace en 2. Valores de atributo. - kjhughes

Además de los cinco caracteres comúnmente conocidos [<,>, &, "y '], también escaparía del carácter de tabulación vertical (0x0B). Es UTF-8 válido, pero no XML 1.0 válido, e incluso muchas bibliotecas (incluida la biblioteca altamente portátil (ANSI C) libxml2) lo pierden y generan silenciosamente XML no válido.

Respondido el 26 de enero de 20 a las 13:01

Abreviado de: XML, escapar

Hay cinco entidades predefinidas:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

"Todos los caracteres Unicode permitidos se pueden representar con una referencia de carácter numérico". Por ejemplo:

&#20013;

La mayoría de los caracteres de control y otros rangos Unicode están específicamente excluidos, lo que significa (creo) que no pueden ocurrir ni de forma directa ni de escape:

Caracteres válidos en XML

Respondido el 17 de diciembre de 19 a las 19:12

Depende del contexto. Por el contenido, es < y & y ]]> (aunque una cadena de tres en lugar de un carácter).

Para valores de atributo, es <, &, " y '.

Para CDATA, es ]]>.

Respondido el 17 de diciembre de 19 a las 19:12

La respuesta aceptada no es correcta. Lo mejor es usar una biblioteca para escapar de xml.

Como se menciona en este otra pregunta

"Básicamente, los caracteres de control y los caracteres fuera de los rangos Unicode no están permitidos. Esto también significa que llamar, por ejemplo, a la entidad de caracteres está prohibido".

Si solo escapas de los cinco personajes. Puedes tener problemas como Se encontró un carácter XML no válido (Unicode: 0xc)

Respondido el 29 de enero de 21 a las 14:01

Solo < y & se requiere que se escapen si se van a tratar datos de caracteres y no marcado:

2.4 Datos de caracteres y marcado

Respondido el 26 de enero de 20 a las 14:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.