que - ¿Qué significa<![CDATA[]]> en XML?
ejemplos cdata xml (11)
CDATA significa "Datos de personaje". Puede usar esto para escapar de algunos caracteres que de lo contrario serán tratados como XML regular. Los datos dentro de esto no serán analizados. Por ejemplo, si desea pasar una URL que contiene &
en ella, puede usar CDATA para hacerlo. De lo contrario, obtendrá un error, ya que se analizará como XML normal.
A menudo encuentro esta extraña etiqueta CDATA
en archivos XML
:
<![CDATA[some stuff]]>
He observado que esta etiqueta CDATA
siempre viene al principio y luego sigue algunas cosas.
Pero a veces se usa, a veces no se usa. Asumo 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
? ¿Nada de lo que escribo en etiquetas XML es algún tipo de datos?
Como otro ejemplo de su uso ...
Si tiene una fuente RSS (documento xml) y desea incluir alguna 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 saca la descripción y representa el HTML dentro de la 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 pubData y dc: creator) ... esto es para la visualización del sitio web con un widget RSS para el cual no tenemos un control de formato real.
Esto nos permite especificar la altura y la posición de la imagen incluida, formatear correctamente los nombres y la fecha del autor, etc., sin la necesidad de un nuevo widget. También significa que puedo escribir esto y no tener que agregarlos a mano.
De Wikipedia:
[En] un documento XML o una entidad analizada externa, una sección CDATA es una sección del contenido del elemento que se marca para que el analizador interprete como datos de caracteres, no como marcado.
Por lo tanto: el texto dentro de CDATA es visto por el analizador pero solo como caracteres no como nodos XML.
El Cdata es un dato que puede pasar a un analizador xml y aún no interpretado como un xml.
Diga, por ejemplo: - Tiene un xml que tiene encapsulados objeto de pregunta / respuesta. Dichos campos abiertos pueden tener cualquier dato que no se encuentre estrictamente bajo el tipo de datos básico o tipos de datos personalizados definidos por xml. Me gusta - ¿Es esta una etiqueta correcta para el comentario xml? .-- Es posible que tenga que pasarlo como está sin que el analizador xml lo interprete como otro elemento secundario. Aquí Cdata viene a su rescate. Al declarar como Cdata, le está diciendo al analizador que no trate los datos envueltos como un xml (aunque puede parecer uno)
Generalmente se utiliza para incrustar datos personalizados, como imágenes o datos de sonido dentro de un documento XML.
Los datos que contiene no se analizarán como XML y, como tal, no es necesario que sean XML válidos o pueden contener elementos que puedan parecer XML pero que no lo son.
Se utiliza para contener datos que de otro modo podrían verse como xml porque contiene ciertos caracteres.
De esta manera se mostrarán los datos internos, pero no se interpretarán.
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 < 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 los caracteres que desea en su archivo xml, sin confundirlos con las etiquetas / atributos XML. Como se mencionó en @paary, otros usos comunes incluyen cuando estás incrustando URL que contienen ampersands. 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 / descodificar esas pocas entidades a medida que edita su archivo xml .
(Sospecho que todas las comparaciones con los comentarios son un tanto engañosas / inútiles).
Una sección CDATA es " una sección del contenido del elemento que está marcada para que el analizador la interprete como solo datos de caracteres, no como 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 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 archivo .xhtml
( no .html
) y ábralo con FireFox ( no con 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 caracteres que contenga ]]>
tendrá que ser, en lo que sé, un nodo de texto. Del mismo modo, desde una perspectiva de manipulación de 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 de DOM lanzará una excepción (en Firefox) o dará como resultado un documento XML mal estructurado: http://jsfiddle.net/9NNHA/
Una vez tuve que usar CDATA cuando mi etiqueta xml necesitaba almacenar código HTML. Algo como
<codearea>
<![CDATA[
<div> <p> my para </p> </div>
]]>
</codearea>
Por lo tanto, CDATA significa que ignorará cualquier carácter que de otra manera podría interpretarse como una etiqueta XML como <y> etc.
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 ser.
Las diferencias clave entre CDATA y comentarios son:
- Como Richard señala , CDATA todavía es parte del documento, mientras que un comentario no lo es.
- En CDATA no puede incluir la cadena
]]>
(CDEnd
), mientras que en un comentario--
no es válido . - Las referencias de entidades de parámetros no se reconocen dentro de los comentarios.
Esto significa, dados estos tres 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>