2009-08-25 25 views
426

Tengo texto XML que deseo mostrar en una página HTML. Este texto contiene un signo &, que quiero representar en su representación de entidad: &.¿Cómo puedo escapar los símbolos en XML para que se muestren como entidades en HTML?

¿Cómo puedo evitar este ampersand en el código fuente XML? Intenté &, pero esto se descifra como el carácter de signo de y real (&), que es invalid in HTML.

Así que quiero escapar de tal manera que se representará como & en la página web que utiliza la salida XML.

+0

El reclamo en la última revisión de esta pregunta que * "el carácter de y comercial real (&) ... no es válido en HTML." * Es falso. De hecho, incluso la respuesta aceptada a la pregunta vinculada proporcionada como justificación indica * "HTML5 le permite dejarlo sin protección, pero solo cuando los datos que siguen no se parecen a una referencia de caracteres válida" *. –

Respuesta

333

Cuando el código XML contiene &, esto se traducirá en el texto &.

Cuando lo utiliza en HTML, se representará como &.

178

Según §2.4 of the XML 1.0 spec, debe poder usar &.

intenté & amp; pero esto no está permitido.

¿Estás seguro de que no es un problema diferente? XML define explícitamente esto como la forma de escapar de los signos y símbolos.

+0

Esto fue perfectamente razonable cuando se publicó, pero los cambios (o quizás aclaraciones) a la pregunta desde entonces han hecho que parezca absurdo como respuesta. Por un lado, el pasaje citado ya no está presente en la pregunta. –

+0

La versión del enlace está desactualizada. Acceda aquí en su lugar: https://www.w3.org/TR/xml/#syntax – nanocv

+1

Gracias por la actualización, @nanocv! –

54

Etiquetas CDATA?

 <![CDATA[ 
     This is some text with ampersands & other funny characters. >> 
    ]]> 
+3

Esto es una suposición en lugar de una respuesta. –

+7

Podría ser una suposición; es correcto sin embargo. Los marcadores CDATA permiten que se usen signos crudos. – Quentin

+16

La publicación original nunca dejó en claro dónde se usaría & para, las etiquetas CDATA no se pueden usar para valores de atributo, solo para el contenido real de las etiquetas, de ahí la razón por la que incluí el '?'. – scragar

101

El carácter '&' es en sí mismo un carácter de escape en XML, por lo que la solución es concatenarlo y un equivalente decimal Unicode para '&' asegurando así que no haya errores de análisis XML. Es decir, reemplace el carácter '&' por '& # 038; '.

+3

¡Realmente prefiero esta solución! También debería ser posible usar la notación hexadecimal: '&' – CoDEmanX

+1

Lógicamente, ¿por qué funcionaría esto? Ambas cadenas tienen un signo comercial, incluido el que tiene el código de carácter en el extremo ... – sijpkes

+2

@sijpkes Porque el ampersand aquí le dice al analizador que los siguientes caracteres se usan para representar a otro personaje, que en este caso sería un signo de unión. Un ampersand no es "ilegal" en XML, solo tiene un significado especial. Significa que "todos los personajes después de esto hasta que toques un punto y coma deberían traducirse a otra cosa". Cuando se tiene un símbolo comercial normalmente, sin los caracteres descriptivos y el punto y coma final, el analizador se confunde. –

2

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text> hará el truco.

3

¿Qué le parece usar el unicode \u0026? Funciona para mí en mis archivos XML de Android. Si surgen problemas, alguien me avisa.

+1

'\ u' escapes no tienen ningún significado especial en XML en general. -1. –

+0

@MarkAmery Sí, no tienen ningún significado especial, y es por eso que funcionan tan bien, no hay nada que interpretar, por lo que no hay nada que salga mal. El java interpreta el Unicode y muestra un ampersand justo como el OP quiere. –

4

He intentado el amplificador &, pero no funcionó. Basado en la respuesta de Wim ten Brink probé & amp; amp y funcionó.

Uno de mis compañeros desarrolladores me sugirió que usara & # x26; y eso funcionó independientemente de cuántas veces se puede procesar.

8

En mi caso tuve que cambiarlo a %26.

Necesitaba escapar & en una URL. Entonces &amp; no funcionó para mí. La función urlencode cambia & a %26. De esta forma, ni XML ni el mecanismo de URL del navegador se quejaron de la URL.

+5

Sí. Sin embargo, tenga en cuenta que el OP se trataba de escapar en XML. Escaparse en una URL es un problema diferente. La verdadera diversión comienza cuando tienes URLs en XML, o fragmentos XML en URLs ... –

3

&amp; es la forma de representar un símbolo en la mayoría de las secciones de un documento XML.

Si usted quiere tener XML mostrado dentro de HTML, es necesario crear primero XML correctamente codificado (que implica cambiar & a &amp;) y continuación la usará para crear HTML correctamente codificado (que implica el nuevo cambio de & a &amp;) . Eso da lugar a:

&amp;amp; 

Para una explicación más completa de codificación XML, ver:

What characters do I need to escape in XML documents?

0

considerar si el código XML se parece a continuación.

<Employees Id="1" Name="ABC"> 
    <Query> 
    SELECT * FROM EMP WHERE ID=1 AND RES<>'GCF' 
    <Query> 
</Employees> 

No se puede utilizar el <> directamente, ya que genera un error. En ese caso, puede usar &#60;&#62; en reemplazo de eso.

<Employees Id="1" Name="ABC"> 
    <Query> 
    SELECT * FROM EMP WHERE ID=1 AND RES &#60;&#62; 'GCF' 
    <Query> 
</Employees> 

Click here para ver todos los códigos.

-1

Un problema relacionado es cómo codificar el contenido del elemento XML cuando dicho contenido contiene un símbolo comercial, si el XML es parte de un URI enviado con una acción GET. (Dejando de lado la sabiduría de tal API, era algo con lo que tenía que lidiar hoy.) Intenté todo lo mencionado anteriormente, y lo único que realmente funcionaba era %26amp;. Se necesitaba %26 para codificar URL al primer carácter en el Codificación XML para ampersand. El amp; siguiente al %26 era necesario porque la porción XML del URI se estaba cargando en un documento XML en el lado del servidor. Por lo tanto, en este escenario divertido, era necesario engrapar ambas metodologías de codificación juntas.

Cuestiones relacionadas