¿Cómo escapo los símbolos en XML para que se representen como entidades en HTML?

524

Tengo un texto XML que deseo representar en una página HTML. Este texto contiene una y comercial, lo que quiero hacer en su representación entidad: &.

¿Cómo escapo a este ampersand en el código fuente XML? Lo intenté &, pero esto está decodificado como el ampersand ( &) real , que no es válido en HTML .

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

AJM
fuente
1
El reclamo en la última revisión de esta pregunta de que "el carácter real de signo (&) ... no es válido en HTML". Es falso. De hecho, incluso la respuesta aceptada a la pregunta vinculada proporcionada como justificación establece que "HTML5 le permite dejarla sin escape, pero solo cuando los datos que siguen no parecen una referencia de caracteres válida" .
Mark Amery el

Respuestas:

422

Cuando su XML contiene &, esto dará como resultado el texto &.

Cuando usas eso en HTML, eso se representará como &.

Wim ten Brink
fuente
195

Según §2.4 de la especificación XML 1.0 , debería poder usar &.

Probé & 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 símbolos de unión.

John Feminella
fuente
3
Esto fue perfectamente razonable cuando se publicó, pero los cambios (o tal vez las aclaraciones) a la pregunta ya que han hecho que parezca absurda como respuesta. Por un lado, el pasaje citado ya no está presente en la pregunta.
Mark Amery
133

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 &garantizar que no haya errores de análisis XML. Es decir, reemplazar el personaje &con &.

problema
fuente
55
¡Realmente prefiero esta solución! También debería ser posible usar la notación hexadecimal:&
CodeManX
2
Lógicamente, ¿por qué funcionaría esto? Ambas cadenas tienen un ampersand, incluido el que tiene el código de carácter al final ...
sijpkes
44
@sijpkes Porque el signo "&" le dice al analizador que los siguientes caracteres se usan para representar otro carácter, que en este caso sería un signo "&". Un ampersand no es "ilegal" en XML, solo tiene un significado especial. Significa "todos los caracteres después de esto hasta que llegue a punto y coma deben traducirse a otra cosa". Cuando tiene un ampersand normalmente, sin los caracteres descriptivos y el punto y coma final, el analizador se confunde.
Riley Major
1
Esta es la respuesta para mí. Añadiendo & # 038; en la ubicación de mi encabezado de respuesta lo arregló y no muestra el amperaje en el encabezado de respuesta. : D
iamjoshua
Stack Overflow es genial. Aquí hay una publicación de casi 11 años que resuelve mi problema. Y se ha visto más de 690,000 veces.
Bill
69

Use CDATAetiquetas:

 <![CDATA[
   This is some text with ampersands & other funny characters. >>
 ]]>
scragar
fuente
44
Esta es una suposición en lugar de una respuesta.
Bryan Oakley el
10
Puede ser una suposición; es correcto sin embargo. Los marcadores CDATA permiten el uso de símbolos crudos.
Quentin
19
La publicación original nunca dejó en claro dónde se usaría el &, las etiquetas CDATA no se pueden usar para valores de atributos, solo para el contenido real de las etiquetas, de ahí la razón por la que incluí el '?'.
scragar
1
Esto también es excelente para caracterizar datos xml y esta respuesta es útil en muchos otros escenarios relacionados con la representación xml. Para mí, realmente ayudó en Camel XML DSL, cuando necesitaba configurar el cuerpo o algún encabezado con algunos datos XML, el analizador Camel XML ignoró el contenido de CDATA, leyéndolos como una secuencia de caracteres. Sin esto, el motor de camello arroja excepciones de estructura XML no válidas
Kimutai
1
Esta es exactamente la respuesta que necesitaba, porque en mi caso no estoy seguro de qué caracteres podrían estar apareciendo en el XML, por lo que necesito escapar de todo en esa sección.
Matt
11

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 manera, ni XML ni el mecanismo de URL del navegador se quejaron de la URL.

Serhat Akay
fuente
8
Si. Sin embargo, tenga en cuenta que el OP se trataba de escapar en XML. Escapar en una URL es un problema diferente. La verdadera diversión comienza cuando tienes URL en XML, o fragmentos XML en URL ...
Oskar Berggren
6

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

Uno de mis colegas desarrolladores me sugirió usar & # x26; y eso funcionó independientemente de cuántas veces se pueda procesar.

mcampos
fuente
5

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

Si desea que se muestre XML dentro de HTML, primero debe crear XML codificado correctamente (lo que implica cambiar &a &amp;) y luego usarlo para crear HTML codificado correctamente (lo que implica cambiar nuevamente &a &amp;). Eso da como resultado:

&amp;amp;

Para obtener una explicación más detallada de la codificación XML, consulte:

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

Riley Major
fuente
4

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

Almiar
fuente
3

¿Qué hay de usar el Unicode \u0026? Funciona para mí en mis archivos XML de Android. Si surgen problemas, alguien hágamelo saber.

Scott Biggs
fuente
1
\ulos escapes no tienen un significado especial en XML en general. -1.
Mark Amery el
@ MarkAmery Sí, no tienen significados especiales, por eso 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 tal como lo desea el OP.
Scott Biggs
1
@ScottBiggs ¿Qué debe hacer Java con la pregunta del OP?
Philippe-André Lorin
1
@ScottBiggs Entonces está fuera de tema. - 1.
Philippe-André Lorin
1
@ScottBiggs El hecho de que funcione para usted y que otros puedan beneficiarse es irrelevante; Su respuesta es ruido para todos los demás lectores. Porque no trata el caso más general sobre el que preguntó el OP. No se trata de no compartir tu éxito. Se trata de mantenerlo donde pertenece. Su contribución puede ser útil, pero no se presenta como respuesta aquí. Tal vez como un comentario, tal vez como una respuesta a otra pregunta (que puede crear y responder usted mismo).
Philippe-André Lorin el
0

Considere si su XML se ve a continuación.

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

No puede usar <>directamente ya que arroja 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>

Haga clic aquí para ver todos los códigos.

Sarath Avanavu
fuente
2
Creo que este terreno estuvo bien cubierto en los 7 años anteriores a la publicación de esta respuesta.
miken32