¿Qué caracteres necesito para escapar en los documentos XML?

Respuestas:

1356

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

Caracteres de escape XML

Solo hay cinco:

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

Los caracteres de escape dependen de dónde se use 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 caracteres ", 'y >no necesitan escaparse en el texto:

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

Atributos

La forma segura es escapar de los cinco caracteres en los atributos. Sin embargo, el >personaje no necesita escapar en atributos:

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

El 'carácter no necesita escapar en atributos si las comillas son ":

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

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

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

Comentarios

Los cinco caracteres especiales no se deben escapar en los comentarios:

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

CDATA

Los cinco caracteres especiales no deben escaparse en las secciones CDATA :

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

Instrucciones de procesamiento

Los cinco caracteres especiales no deben escaparse en las instrucciones de procesamiento XML:

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

XML vs. HTML

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

Welbog
fuente
33
@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
55
También para saltos de línea necesita usar & # xA; & # xD; y & # x9; para pestaña, si necesita estos caracteres en un atributo.
radistao
78
Si va a hacer una búsqueda / reemplazo en estos, solo recuerde hacer & amp; reemplazo antes que los demás.
Doug
2
@Doug Estaba a punto de mencionar exactamente lo mismo, o de lo contrario todos los demás personajes reemplazados se corromperán, y cosas como &quot;estas se cambiarán a&amp;quot;
Jerry Dodge
55
De Wikipedia: "Todos los caracteres Unicode permitidos pueden representarse con una referencia de caracteres numéricos". Así que hay mucho más que 5.
Tim Cooper
93

Quizás esto ayude:

Lista de referencias de entidades de caracteres XML y HTML :

En los 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 (representarse a sí mismo), o puede representarse mediante una serie de caracteres llamados referencia de caracteres, de los cuales hay dos tipos: una referencia de caracteres numéricos y una referencia de entidad de caracteres. Este artículo enumera las referencias de 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    >
Andrew Hare
fuente
73

De acuerdo con 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 usan como delimitadores de marcado 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:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

Tenga en cuenta que las entidades mencionadas también se pueden utilizar en HTML, con la excepción de & apos; , 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 & # 39; en lugar.

Albz
fuente
14
XML predefine esas cinco entidades, pero NO especifica que no puede usar ninguno de esos cinco caracteres en su forma literal. <y & tienen que escaparse a todas partes (excepto CDATA). "y 'solo tienen que escaparse en valores de atributo, y solo si el carácter de comilla correspondiente es el mismo. Y> en realidad nunca tiene que escaparse.
Shaun McCance
3
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 se escapa. Lo mismo para un comentario (¿escaparías de & 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 las recomendaciones oficiales para XML por W3C .
Albz
77
@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
2
No para ser un nigromante, pero @Albz es incorrecto al decir que estos caracteres DEBEN tener derecho 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, & amp; y & lt; tiene que estar siempre autorizado. El & gt; el carácter PUEDE ser autorizado, aunque DEBE serlo cuando aparece en la cadena literal "]]>" porque de lo contrario se leerá como finalizando una sección CDATA. Para comillas simples y comillas dobles, puede escapar si lo desea. Eso es todo, para chardata dentro de elementos. Otros componentes de XML tienen otras reglas.
skye --- capitán
52

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;

De datos de caracteres y marcado :

El carácter de y comercial (&) y el paréntesis angular izquierdo (<) no deben aparecer en su forma literal, excepto cuando se usan 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, se deben escapar utilizando referencias de caracteres numéricos o las cadenas "& amp;" y "& lt;" respectivamente. El corchete angular derecho (>) puede representarse usando la cadena "& gt;" y debe, por compatibilidad, escapar usando "& gt;" o una referencia de caracteres cuando aparece en la cadena "]]>" en el contenido, cuando esa cadena no marca el final de una sección CDATA.

Para permitir que los valores de atributo contengan comillas simples y dobles, el carácter de apóstrofe o comillas simples (') puede representarse como "& apos;", y el carácter de comillas dobles (") como" & quot; ".

Peter Bartels
fuente
Esto implica que para los atributos solo se deben escapar las comillas, pero eso se suma a los otros tres caracteres
eug
40

Nueva respuesta simplificada a una vieja pregunta común ...

Escapado XML simplificado (priorizado, 100% completado)

  1. Siempre (90% importante para recordar)

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

    • attr=" 'Las comillas simples 'están bien entre comillas dobles."
    • attr=' "Las comillas dobles "están bien dentro de comillas simples.'
    • Escapar "como &quot;y de 'lo &apos;contrario.
  3. Comentarios , CDATA e instrucciones de procesamiento (0.9% importante para recordar)

    • <!--Dentro de los comentarios --> no se debe escapar nada, pero no --se permiten condiciones.
    • <![CDATA[Dentro de CDATA ]]> no se debe escapar nada, pero no ]]>se permiten cadenas.
    • <?PITargetDentro de los PI ?> no se debe escapar nada, pero no ?>se permiten cadenas.
  4. Esotérica (0.1% importante para recordar)

    • Escapar ]]>como a ]]&gt;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).
kjhughes
fuente
Otra regla que vale la pena señalar: se ]]>debe escapar como ]]&gt;, incluso cuando no está en una sección CDATA. La forma más fácil de alcanzar que puede ser la de siempre escapar >tan &gt;.
Michael Kay
Gracias, @MichaelKay. He incorporado su útil nota sobre, ]]> pero elegí relegarla a esotérica en lugar de sugerir que > siempre se escape (lo cual no es necesario, como saben). Mi objetivo aquí es hacer que las reglas de escape XML sean fáciles de recordar y 100% precisas .
kjhughes
Las respuestas anteriores, incluida una mencionada, mencionan que los cinco caracteres deben escaparse dentro de los atributos. ¿Tiene alguna referencia al estándar XML para respaldar lo que dice, ya que su respuesta parece ser la correcta?
Roman Susi
1
@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 W3C XML; vea las muchas referencias vinculadas al BNF oficial, y (b) organizado en una progresión concisa, lógica y fácil de recordar de esos requisitos.
kjhughes
@RomanSusi: La afirmación específica de que "los cinco caracteres deben escaparse dentro de los atributos" es una guía descuidada no respaldada por la regla oficial de BNF para AttValuecitada en mi respuesta a través de un enlace en 2. Valores de atributo .
kjhughes
25

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 es válido XML 1.0, e incluso muchas bibliotecas (incluida la biblioteca altamente portátil (ANSI C) libxml2 ) lo omite y genera silenciosamente XML no válido.

Charon ME
fuente
11

Abreviado de: XML, Escaping

Hay cinco entidades predefinidas:

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

"Todos los caracteres Unicode permitidos pueden representarse con una referencia de caracteres numéricos". 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 ya sea escapados o directos:

Caracteres válidos en XML

Tim Cooper
fuente
3

Depende del contexto. Para 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 ]]> .

把 友情 留 在 无 盐
fuente