Pregunta ¿Qué significa en XML?


A menudo me parece extraño CDATA etiqueta adentro XML archivos:

<![CDATA[some stuff]]>

He observado que esto CDATA la etiqueta siempre viene al principio, y luego sigue algunas cosas.

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


803
2018-05-06 20:20


origen


Respuestas:


CDATA representa Datos de personaje y significa que los datos entre estas cadenas incluyen datos que podría ser interpretado como marcado XML, pero no debería ser.

Las principales diferencias entre CDATA y los comentarios son:

Esto significa que 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>

763
2018-05-06 20:23



Una sección de CDATA es "una sección del contenido del elemento que está marcada para que el analizador interprete solo los datos del carácter, no el 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 .xhtml archivo (no  .html) y ábrelo 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 para tener en cuenta con las secciones CDATA es que no tienen codificación, por lo que no hay forma de incluir la cadena ]]> en ellos. Cualquier dato de carácter que contenga ]]> tendrá que - por lo que sé - ser un nodo de texto en su lugar. Del mismo modo, desde una perspectiva de manipulación DOM no puede crear una sección CDATA que incluye ]]>:

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

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


307
2018-05-06 20:35



Un gran caso de uso: su xml incluye un programa, como datos (por ejemplo, un tutorial de páginas 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 de 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 se mencionó en @paary, otros usos comunes incluyen cuando está incorporando URL que contienen símbolos. 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 o encriptar esas pocas entidades mientras edita su archivo xml .

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


56
2018-05-28 13:26



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

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

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


33
2018-05-14 04:28



Los datos contenidos en ellos no se analizarán como XML, y como tales no necesitan ser XML válidos o pueden contener elementos que pueden parecer XML pero no lo son.


26
2018-05-06 20:23



De la Wikipedia:

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

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.


10
2018-01-15 14:49



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 esto no serán analizados. Por ejemplo, si desea pasar una URL que contiene & en él, puedes usar CDATA para hacerlo. De lo contrario, obtendrá un error, ya que se analizará como XML normal.


7
2018-05-10 04:52



Como otro ejemplo de su uso ...

Si tiene una fuente RSS (documento xml) y desea incluir alguna codificación HTML básica en la pantalla 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 representa el HTML dentro de CDATA.

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


Y como explicación de por qué este ejemplo usa CData (y no las etiquetas pubData y dc: creator apropiadas) ... esto es para la visualización del sitio web usando 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 los nombres de los autores y la fecha 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.


6
2017-09-23 15:44



Se usa para contener datos que, de lo contrario, podrían verse como xml porque contienen ciertos caracteres.

De esta forma, se mostrarán los datos, pero no se interpretarán.


3
2018-05-06 20:23