O que significa em XML?

muitas vezes acho esta marca estranha CDATA em XML Ficheiros:

<![CDATA[some stuff]]>

Tenho observado que esta etiqueta CDATA vem sempre no início, e depois seguida por algumas coisas.

mas às vezes é usado, às vezes não é. Presumo que seja para marcar que some stuff são os "dados" que serão inseridos depois disso. Mas que tipo de dados são some stuff? Nada do que escrevo em etiquetas XML é algum tipo de dados?

 1065
Author: jpaugh, 2010-05-06

13 answers

CDATA significa dados de caracteres e significa que os dados entre estas cadeias de caracteres incluem dados que podem ser interpretados como marcação XML, mas não devem ser.

As principais diferenças entre CDATA e comentários são:

Isto significa que, dados estes quatro excertos de XML de um documento bem 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>
 994
Author: Sean Vieira, 2020-03-31 00:58:31

Uma secção CDATA é " uma secção do conteúdo do elemento que está marcada para que o analisador interprete apenas como dados de carácter, não como marcação."

Sintaticamente, comporta-se de forma semelhante a um comentário:

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

... mas ainda faz parte do 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>

Tente salvar a seguir como um .xhtml arquivo (não .html) e abri-lo usando o FireFox (não o Internet Explorer) para ver a diferença entre o comentário e a seção CDATA; o o comentário não irá aparecer quando você olhar para o documento num navegador, enquanto a secção CDATA irá:

<?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 ter em conta com as seções CDATA é que elas não têm codificação, por isso não há maneira de incluir a string ]]> nelas. Qualquer dado de caracteres que contenha ]]> terá de - tanto quanto sei-ser um nó de texto em vez disso. Da mesma forma, a partir de uma perspectiva de manipulação DOM você não pode criar uma seção CDATA que inclui ]]>:

var myEl = xmlDoc.getElementById("cdata-wrapper");
myEl.appendChild(xmlDoc.createCDATASection("This section cannot contain ]]>"));
Esta manipulação DOM o código abrirá uma excepção (no Firefox) ou resultará num documento XML mal estruturado: http://jsfiddle.net/9NNHA/
 346
Author: Richard JP Le Guen, 2014-03-25 15:36:56

Um grande caso de uso: o seu xml inclui um programa, como dados (por exemplo, um tutorial de página web para Java). Nessa situação, seus dados incluem um grande bloco de caracteres que incluem '&' E'

Comparar:

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

Com

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

Especialmente se você estiver copiando / colando este código de um arquivo (ou incluindo-o, em um pré-processador), é bom ter apenas os caracteres que você quer em seu arquivo xml, w / o confundindo-os com XML marcas / atributos. Como @paary mencionou, outros usos comuns incluem quando você está incorporando URLs que contêm Amplificadores. Finalmente, mesmo que os dados contenham apenas alguns caracteres especiais ,mas os dados são muito longos (o texto de um capítulo, por exemplo), é bom não ter que ser en/de-codificar essas poucas entidades enquanto você edita seu arquivo xml.

(Suspeito que todas as comparações com comentários são meio enganosas / inúteis.)
 71
Author: not-just-yeti, 2014-05-28 13:52:44

Uma vez tive de usar CDATA quando o meu elemento xml precisava de guardar o código HTML. Algo como

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

Então o CDATA significa que irá ignorar qualquer carácter que possa ser interpretado de outra forma como marca XML como etc.

 43
Author: Octane, 2019-01-02 11:42:13

Os dados neles contidos não serão tratados como XML, e como tal não precisam de ser válidos XML ou podem conter elementos que possam parecer XML mas não o são.

 34
Author: fbrereto, 2010-05-06 20:23:19

Da Wikipédia:

[em] um documento XML ou entidade externa analisada, uma secção CDATA é uma secção do conteúdo do elemento que está marcado para o analisador interpretar como apenas dados de caracteres, não de marcação.

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

Assim: o texto dentro do CDATA é visto pelo analisador, mas apenas como caracteres não como nós XML.

 17
Author: Chdid, 2018-04-25 10:53:50

Como outro exemplo da sua utilização:

Se tiver uma fonte RSS (documento xml) e quiser incluir alguma codificação HTML básica no ecrã da descrição, poderá usar o CData para codificá-la:

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

O leitor RSS puxa a descrição e torna o HTML dentro do CDATA.

Nota - nem todas as etiquetas HTML funcionam - acho que depende do leitor de RSS que está a usar.


E como explicação para por que este exemplo usa CData (e não o apropriado pubData e dc: creator tags): isto é para a exibição do site usando um widget RSS para o qual não temos nenhum controle de formatação real.

Isto permite-nos especificar a altura e a posição da imagem incluída, formatar os nomes do autor e a data correctamente, e assim por diante, sem a necessidade de um novo elemento. Também significa que posso escrever isto e não ter que adicioná-los à mão.

 17
Author: LadyCygnus, 2019-02-23 04:49:35

CDATA significa Dados de carácter. Você pode usar isso para escapar de alguns caracteres que de outra forma serão tratados como XML regular. Os dados dentro deste NÃO serão analisados. Por exemplo, se você quiser passar um URL que contém & nele, você pode usar CDATA para fazê-lo. Caso contrário, você vai obter um erro como ele será processado como XML regular.

 11
Author: paary, 2013-06-28 20:39:05

É usado para conter dados que poderiam ser vistos como xml porque contém certos caracteres.

Desta forma os dados dentro serão exibidos, mas não interpretados.

 7
Author: Ikke, 2017-07-12 04:53:29

Escapa a uma cadeia que não pode ser passada para XML como de costume:

Exemplo:

a string contém " & " nela.

Não podes:

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

Por isso, deve utilizar CDATA:

<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>
 7
Author: HoangYell, 2019-03-25 03:28:39

Normalmente usado para incorporar dados personalizados, como imagens ou dados de som num documento XML.

 2
Author: Johan, 2010-05-06 20:26:29

O Cdata é um dado que você pode querer passar para um analisador xml e ainda não interpretado como um xml.

Diga por exemplo: - você tem um xml que encapsula objeto de Pergunta / Resposta . Tais campos abertos podem ter quaisquer dados que não se enquadrem estritamente no tipo de dados básicos ou tipos de dados personalizados definidos em xml. Como o -- Esta é uma marca correcta para o comentário em xml ? .-- Você pode ter um requisito para passá-lo como ele é sem ser interpretado pelo analisador xml como outro filho elemento. Aqui a Cdata vem em teu socorro . Ao declarar como Cdata você está dizendo ao analisador não tratar os dados embrulhados como um xml (embora possa parecer um)

 2
Author: randomness, 2013-11-19 19:12:02

Note que a construção CDATA só é necessária se colocar o texto directamente no ficheiro de texto XML.

Isto é, só precisa de usar {[[0]} se escrever à mão ou se programar programaticamente o texto XML directamente.

Qualquer texto introduzido com uma API de processador DOM ou SimpleXML será automaticamente escapado para evitar a falta de regras de conteúdo XML.

Apesar disso, pode haver alturas em que o uso de {[[0]} pode reduzir o tamanho do texto que de outra forma seria produzido com todos os entidades codificadas, como para css em style tags ou javascript em script tags, onde muitas construções de linguagem usam caracteres em HTML / XML,como < e >.

 1
Author: Patanjali, 2020-10-11 02:07:20