¿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?

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>

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/


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).


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.


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.


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.


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.


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.


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.


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>

1

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


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)


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.