¿Qué significa <![CDATA[]]> en XML?
A menudo encuentro esta CDATA
etiqueta extraña en XML
los archivos:
<![CDATA[some stuff]]>
He observado que esta CDATA
etiqueta siempre aparece al principio y luego sigue algunas cosas.
Pero a veces se utiliza y otras no. Supongo que es para marcar que some stuff
son los "datos" que se insertarán después de eso. ¿ Pero qué tipo de datos son some stuff
? ¿No es nada de lo que escribo en etiquetas XML algún tipo de datos?
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 comentarios son:
- Como señala Richard , CDATA sigue siendo parte del documento, mientras que un comentario no lo es.
- En CDATA no se puede incluir la cadena
]]>
(CDEnd
), mientras que en un comentario--
no es válido . - Las referencias a entidades paramétricas no se reconocen dentro de los comentarios.
Esto significa que, 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>
Una sección CDATA es " una sección de contenido de elemento que está marcada para que el analizador la interprete solo como datos de caracteres, no como marcas " .
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 sigue siendo 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 .xhtml
archivo ( 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 mires 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 puedes 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 generará una excepción (en Firefox) o dará como resultado un documento XML mal estructurado: http://jsfiddle.net/9NNHA/
Un gran caso de uso: su xml incluye un programa, como datos (por ejemplo, un tutorial de una página web para Java). En esa situación, sus datos incluyen una gran cantidad de caracteres que incluyen '&' y '<', pero esos caracteres no deben ser xml.
Comparar:
<example-code>
while (x < len && !done) {
print( "Still working, 'zzz'." );
++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 solo los caracteres que desea en su archivo xml, sin confundirlos con etiquetas/atributos XML. Como mencionó @paary, otros usos comunes incluyen cuando se insertan URL que contienen símbolos. Finalmente, incluso si los datos solo contienen unos pocos caracteres especiales pero son muy largos (el texto de un capítulo, por ejemplo), es bueno no tener que codificar o decodificar esas pocas entidades mientras editas tu archivo xml. .
(Sospecho que todas las comparaciones con los comentarios son un poco engañosas o inútiles).
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.
Los datos contenidos en él no se analizarán como XML y, como tal, no es necesario que sean XML válidos ni pueden contener elementos que puedan parecer XML pero no lo son.