¿Qué significa <! [CDATA []]> en XML?

1014

A menudo encuentro esta extraña CDATAetiqueta en los XMLarchivos:

<![CDATA[some stuff]]>

He observado que esta CDATAetiqueta siempre aparece al principio y luego sigue algunas cosas.

Pero a veces se usa, a veces no. Supongo que es para marcar que some stuffson los "datos" que se insertarán después de eso. ¿Pero qué tipo de datos son some stuff? ¿No escribo algo en las etiquetas XML algún tipo de datos?

dontWatchMyProfile
fuente

Respuestas:

951

CDATA significa Datos de caracteres y significa que los datos entre estas cadenas incluyen datos que podrían interpretarse como marcado XML, pero no deberían serlo.

Las diferencias clave entre CDATA y los comentarios son:

Esto significa dados estos cuatro fragmentos de XML de un documento bien formado:

<!ENTITY MyParamEntity "Has been expanded">

<!--
Within this comment I can use ]]>
and other reserved characters like <
&, ', and ", but %MyParamEntity; will not be expanded
(if I retrieve the text of this node it will contain
%MyParamEntity; and not "Has been expanded")
and I can't place two dashes next to each other.
-->

<![CDATA[
Within this Character Data block I can
use double dashes as much as I want (along with <, &, ', and ")
*and* %MyParamEntity; will be expanded to the text
"Has been expanded" ... however, I can't use
the CEND sequence. If I need to use CEND I must escape one of the
brackets or the greater-than sign using concatenated CDATA sections.
]]>

<description>An example of escaped CENDs</description>
<!-- This text contains a CEND ]]> -->
<!-- In this first case we put the ]] at the end of the first CDATA block
     and the > in the second CDATA block -->
<data><![CDATA[This text contains a CEND ]]]]><![CDATA[>]]></data>
<!-- In this second case we put a ] at the end of the first CDATA block
     and the ]> in the second CDATA block -->
<alternative><![CDATA[This text contains a CEND ]]]><![CDATA[]>]]></alternative>
Sean Vieira
fuente
35
¿Cómo se puede escapar un personaje de la secuencia CEND?
Thomas Weller
23
Debe tener dos secciones CDATA para concatenar el ]]y el >- vea esta respuesta para ver cómo y por qué.
Sean Vieira
2
¿Tiene que haber un nuevo carácter de línea entre el inicio de CDATA y los datos sin procesar?
Ben Sewards
2
No, no hay @BenSewards
Sean Vieira
55
Por lo que este pedazo de C-como de códigos no han fácilmente ser puesto en una sección CDATA: if (a[b[c]]>10) { }.
Anders Tornblad
341

Una sección CDATA es " una sección del contenido del elemento que está marcado para que el analizador lo interprete solo como datos de caracteres, no marcado " .

Sintácticamente, se comporta de manera similar a un comentario:

<exampleOfAComment>
<!--
    Since this is a comment
    I can use all sorts of reserved characters
    like > < " and &
    or write things like
    <foo></bar>
    but my document is still well-formed!
-->
</exampleOfAComment>

... pero todavía es parte del documento:

<exampleOfACDATA>
<![CDATA[
    Since this is a CDATA section
    I can use all sorts of reserved characters
    like > < " and &
    or write things like
    <foo></bar>
    but my document is still well formed!
]]>
</exampleOfACDATA>

Intente guardar lo siguiente como un .xhtmlarchivo ( no .html ) y ábralo usando FireFox ( no Internet Explorer ) para ver la diferencia entre el comentario y la sección CDATA; el comentario no aparecerá cuando mire el documento en un navegador, mientras que la sección CDATA:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" >
<head>
<title>CDATA Example</title>
</head>
<body>

<h2>Using a Comment</h2>
<div id="commentExample">
<!--
You won't see this in the document
and can use reserved characters like
< > & "
-->
</div>

<h2>Using a CDATA Section</h2>
<div id="cdataExample">
<![CDATA[
You will see this in the document
and can use reserved characters like
< > & "
]]>
</div>

</body>
</html>

Algo a tener en cuenta con las secciones CDATA es que no tienen codificación, por lo que no hay forma de incluir la cadena ]]>en ellas. Cualquier dato de carácter que contenga ]]>tendrá que, hasta donde yo sé, ser un nodo de texto. Del mismo modo, desde una perspectiva de manipulación DOM, no puede crear una sección CDATA que incluya ]]>:

var myEl = xmlDoc.getElementById("cdata-wrapper");
myEl.appendChild(xmlDoc.createCDATASection("This section cannot contain ]]>"));

Este código de manipulación DOM arrojará una excepción (en Firefox) o dará como resultado un documento XML mal estructurado: http://jsfiddle.net/9NNHA/

Richard JP Le Guen
fuente
3
Entonces, ¿por qué "ý" no está permitido en CDATA?
bjan
11
@bjan - ¿Qué te hace pensar que es un personaje ilegal? Parece que podría tener un problema de codificación.
Richard JP Le Guen
Abrí el documento en IE, también estoy usando el analizador MSXML que lo declaró como un carácter no válido. Tengo un xsd en el que se declara como "type =" xs: string "". ¿Está relacionado con la codificación o la versión xml?
bjan
CDATA se analiza y solo se permite un rango válido de caracteres aquí, se usa para escapar de bloques de texto que contienen caracteres que de otro modo serían reconocidos como marcado
bjan
1
Por lo tanto, podríamos usar CDATA para pasar de contrabando algo de HTML al documento XML, para que el HTML no confunda la estructura del documento XML, y luego usar XSLT más tarde para extraerlo y escupirlo en un documento HTML que se está emitiendo.
Kaz
69

Un gran caso de uso: su xml incluye un programa, como datos (por ejemplo, un tutorial de página web para Java). En esa situación, sus datos incluyen una gran cantidad de caracteres que incluyen '&' y '<' pero esos caracteres no están destinados a ser xml.

Comparar:

<example-code>
while (x &lt; len &amp;&amp; !done) {
    print( &quot;Still working, &apos;zzz&apos;.&quot; );
    ++x;
    }
</example-code>

con

<example-code><![CDATA[
while (x < len && !done) {
    print( "Still working, 'zzzz'." );
    ++x;
    }
]]></example-code>

Especialmente si está copiando / pegando este código desde un archivo (o incluyéndolo en un preprocesador), es bueno tener los caracteres que desea en su archivo xml, sin confundirlos con etiquetas / atributos XML. Como @paary mencionó, otros usos comunes incluyen cuando se incrustan URL que contienen símbolos de unión. Finalmente, incluso si los datos solo contienen unos pocos caracteres especiales, pero los datos son muy largos (el texto de un capítulo, por ejemplo), es bueno no tener que codificar esas pocas entidades a medida que edita su archivo xml. .

(Sospecho que todas las comparaciones con los comentarios son un poco engañosas / inútiles).

no solo yeti
fuente
41

Una vez tuve que usar CDATA cuando mi elemento xml necesitaba almacenar código HTML. Algo como

<codearea>
  <![CDATA[ 
  <div> <p> my para </p> </div> 
  ]]>
</codearea>

Entonces, CDATA significa que ignorará cualquier carácter que de otro modo podría interpretarse como una etiqueta XML como <y> etc.

Octano
fuente
2
No "etiqueta" sino elemento en la primera oración.
Ludovic Kuty
32

Los datos que contiene no se analizarán como XML y, como tal, no es necesario que sea un XML válido o puede contener elementos que pueden parecer XML pero no lo son.

fbrereto
fuente
16

De Wikipedia:

[En] un documento XML o una entidad analizada externa, una sección CDATA es una sección del contenido del elemento que está marcado para que el analizador interprete solo datos de caracteres, no marcas.

http://en.wikipedia.org/wiki/CDATA

Por lo tanto: el analizador ve el texto dentro de CDATA pero solo como caracteres, no como nodos XML.

Chdid
fuente
13

Como otro ejemplo de su uso:

Si tiene una fuente RSS (documento xml) y desea incluir una codificación HTML básica en la visualización de la descripción, puede usar CData para codificarla:

<item>
  <title>Title of Feed Item</title>
  <link>/mylink/article1</link>
  <description>
    <![CDATA[
      <p>
      <a href="/mylink/article1"><img style="float: left; margin-right: 5px;" height="80" src="/mylink/image" alt=""/></a>
      Author Names
      <br/><em>Date</em>
      <br/>Paragraph of text describing the article to be displayed</p>
    ]]>
  </description>
</item>

El lector RSS extrae la descripción y procesa el HTML dentro del CDATA.

Nota: no todas las etiquetas HTML funcionan. Creo que depende del lector RSS que esté utilizando.


Y como explicación de por qué este ejemplo usa CData (y no las etiquetas apropiadas de pubData y dc: creator): esto es para la visualización del sitio web usando un widget RSS para el que no tenemos un control de formato real.

Esto nos permite especificar la altura y la posición de la imagen incluida, formatear los nombres y la fecha del autor correctamente, y así sucesivamente, sin la necesidad de un nuevo widget. También significa que puedo escribir esto y no tener que agregarlos a mano.

LadyCygnus
fuente
9

CDATA significa Datos de caracteres. Puede usar esto para escapar de algunos caracteres que de lo contrario se tratarán como XML normal. Los datos dentro de este no serán analizados. Por ejemplo, si desea pasar una URL que contiene &, puede usar CDATA para hacerlo. De lo contrario, recibirá un error, ya que se analizará como XML normal.

paary
fuente
6

Se utiliza para contener datos que de otro modo podrían verse como xml porque contiene ciertos caracteres.

De esta manera, los datos en el interior se mostrarán, pero no se interpretarán.

Ikke
fuente
5

Se escapa de una cadena que no se puede pasar a XML como de costumbre:

Ejemplo:

La cadena contiene "&" en ella.

No se puede:

<FL val="Company Name">Dolce & Gabbana</FL>

Por lo tanto, debe usar CDATA:

<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>
HoangYell
fuente
1

Generalmente se usa para incrustar datos personalizados, como imágenes o datos de sonido dentro de un documento XML.

Johan
fuente
3
Aunque podría poner datos binarios codificados en texto en una sección CDATA, no tiene que hacerlo, porque CDATA no tiene nada que ver directamente con nada binario.
Joel Mueller
1

El Cdata es un dato que puede pasar a un analizador xml y que aún no se interpreta como un xml.

Digamos, por ejemplo: - Tiene un xml que tiene un objeto de pregunta / respuesta encapsulado. Dichos campos abiertos pueden tener cualquier información que no pertenezca estrictamente al tipo de datos básicos o los tipos de datos personalizados definidos por XML. Me gusta: ¿es esta una etiqueta correcta para el comentario xml? Es posible que deba pasarlo tal como está sin que el analizador xml lo interprete como otro elemento secundario. Aquí Cdata viene a tu rescate. Al declarar como Cdata, le está diciendo al analizador que no trate los datos empaquetados como un xml (aunque puede parecer uno)

aleatoriedad
fuente
0

Tenga en cuenta que la CDATAconstrucción solo es necesaria si coloca texto directamente en el archivo de texto XML.

Es decir, solo necesita usarlo CDATAsi escribe a mano o crea directamente el texto XML mediante programación.

Cualquier texto ingresado usando una API de procesador DOM o SimpleXML se escapará automáticamente para evitar la ejecución de reglas de contenido XML.

Patanjali
fuente