ejemplos - Html dentro de XML. ¿Debo usar CDATA o codificar el HTML?
xml encode php (11)
CDATA es más fácil de leer a simple vista, mientras que el contenido codificado puede tener el final de los marcadores CDATA de forma segura, pero no tiene que preocuparse. Solo use una biblioteca XML y deje de preocuparse por eso. Entonces, todo lo que tiene que decir es "Ponga este texto dentro de este elemento" y la biblioteca lo codificará o envolverá en marcadores CDATA.
Estoy usando XML para compartir contenido HTML. AFAIK, podría incrustar el HTML ya sea por:
Codificándolo: no sé si es completamente seguro de usar. Y tendría que decodificarlo de nuevo.
Usar secciones CDATA: aún podría tener problemas si el contenido contiene la etiqueta de cierre "]]>" y ciertos caracteres hexadecimales, creo. Por otro lado, el analizador XML extraería la información de forma transparente para mí.
¿Qué opción debería elegir?
ACTUALIZACIÓN: El xml se creará en java y se pasará como una cadena a un servicio web .net, donde se analizará. Por lo tanto, necesito poder exportar el xml como una cadena y cargarlo usando "doc.LoadXml (xmlString);"
CDATA por simplicidad.
Creo que la respuesta depende de lo que planeas hacer con el contenido html y también del tipo de contenido html que piensas admitir.
Especialmente cuando se trata de javascript incluido, la codificación a menudo genera problemas. CDATA definitivamente te ayuda allí.
Si planeas usar solo pequeños fragmentos (es decir, un párrafo) y tienes una forma de preprocesar / filtrarlo (porque oyu no quieres javascript o cosas extravagantes de todos modos), probablemente estarás mejor con la codificación o simplemente poniéndolo directamente como subárbol en el xml. También puede postprocesar el html (es decir, estilo de filtro o atributos onclick). Pero esto es definitivamente más trabajo.
La codificación funcionará bien y es confiable. Puede codificar secciones codificadas, etc. sin dificultad.
La decodificación se realizará de forma automática con el analizador XML que se utilice para manejar el código HTML codificado.
Las dos opciones son casi exactamente iguales. Aquí están sus dos opciones:
<html>This is <b>bold</b></html>
<html><![CDATA[This is <b>bold</b>]]></html>
En ambos casos, debe verificar su cadena para que se escapen los caracteres especiales. Muchas personas pretenden que las cadenas CDATA no necesitan escaparse, pero como usted señala, debe asegurarse de que "]]>" no se deslice sin protección.
En ambos casos, el procesador XML devolverá su cadena decodificada.
No sé qué creador de XML está utilizando, pero PHP (en realidad, libxml) sabe cómo manejar ]]>
dentro de las secciones de CDATA, y lo mismo ocurre con cualquier otro marco XML. Entonces, usaría una sección CDATA.
Personalmente, odio los segmentos CDATA, así que utilizaría la codificación en su lugar. Por supuesto, si agrega XML a XML a XML, esto daría como resultado la codificación sobre la codificación sobre la codificación y, por lo tanto, algunos resultados muy ilegibles. ¿Por qué odio los segmentos CDATA? Ojalá supiera. Preferencia personal, en su mayoría. Simplemente no me gusta acostumbrarme a agregar "personajes prohibidos" dentro de un segmento especial donde de repente se les permitiría volver. Simplemente me confunde cuando veo el marcado XML dentro de un segmento CDATA y no es parte del XML que lo rodea. Al menos con la codificación, veré que está codificada.
Buenas bibliotecas XML manejarán los segmentos de codificación y CDATA de forma transparente. Solo son mis ojos los que se lastiman.
Puedes usar la combinación de ambos. Por ejemplo, si quiere pasar <h1>....</h1>
en el nodo xml, tiene que usar la sección CDATA para pasarlo. El contenido dentro de <h1>...</h1>
debe estar codificado en entidades html como, por ejemplo, <
, para <
. La codificación entre etiquetas resolverá el problema de]]> quedar atrapado mientras se convierte a ]]>
y las etiquetas html no contienen ]]>
.
Puede hacer esto solo si html es generado por usted mismo.
Si su HTML está bien formado, simplemente incruste las etiquetas HTML sin escaparse ni envolverse en CDTATA. Si es posible, ayuda a mantener su contenido en XML. Le da más flexibilidad para transformar y manipular el documento.
Puede establecer un espacio de nombre para el HTML, de modo que pueda desambiguar las etiquetas HTML del otro XML que lo envuelve.
Texto escapado significa que todo el bloque HTML será un gran nodo de texto. El ajuste en CDATA le dice al analizador XML que no analice esa sección. Puede ser "más fácil", pero limita tus capacidades hasta el límite y solo debe emplearse cuando sea apropiado; no solo porque es más conveniente. El marcado escapado se considera dañino.
Si usa CDATA, debe decodificarlo correctamente (textContent, value e innerHTML son métodos que NO devolverán los datos correctos).
digamos que usas una estructura xml similar a esto:
<response>
<command method="setcontent">
<fieldname>flagOK</fieldname>
<content>479</content>
</command>
<command method="setcontent">
<fieldname>htmlOutput</fieldname>
<content>
<![CDATA[
<tr><td>2013/12/05 02:00 - 2013/12/07 01:59 </td></tr><tr><td width="90">Rastreado</td><td width="60">Placa</td><td width="100">Data hora</td><td width="60" align="right">Km/h</td><td width="40">Direção</td><td width="40">Azimute</td><td>Mapa</td></tr><tr><td>Silverado</td><td align=''left''>CQK0052</td><td>05/12/2013 13:55</td><td align=''right''>113</td><td align=''right''>NE</td><td align=''right''>40</td><td><a href="http://maps.google.com/maps?q=-22.6766,-50.2218&iwloc=A&t=h&z=18" target="_blank">-22.6766,-50.2218</a></td></tr><tr><td>Silverado</td><td align=''left''>CQK0052</td><td>05/12/2013 13:56</td><td align=''right''>112</td><td align=''right''>NE</td><td align=''right''>23</td><td><a href="http://maps.google.com/maps?q=-22.6638,-50.2106&iwloc=A&t=h&z=18" target="_blank">-22.6638,-50.2106</a></td></tr><tr><td>Silverado</td><td align=''left''>CQK0052</td><td>05/12/2013 18:00</td><td align=''right''>111</td><td align=''right''>SE</td><td align=''right''>118</td><td><a href="http://maps.google.com/maps?q=-22.7242,-50.2352&iwloc=A&t=h&z=18" target="_blank">-22.7242,-50.2352</a></td></tr>
]]>
</content>
</command>
</response>
en javascript, entonces decodificará cargando el xml (jquery, por ejemplo) en una variable como xmlDoc a continuación y luego obteniendo nodeValue para la segunda ocurrencia ( item(1)
) de la etiqueta de content
xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue
o (ambas anotaciones son equivalentes)
xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue
Tiene sentido ajustar HTML en CDATA. El texto HTML probablemente constituirá un solo valor en XML.
Así que no incluirlo en CDATA hará que todos los analizadores xml lo lean como parte del documento XML. Si bien es fácil eludir este problema al usar el xml, ¿por qué el dolor de cabeza extra?
Si realmente quiere analizar el HTML en un DOM, entonces es mejor leer el texto HTML y configurar un analizador para leer la prueba por separado.
Espero que salga como yo quería.