O que significa <! [CDATA []]> em XML?

1014

Costumo encontrar essa CDATAtag estranha nos XMLarquivos:

<![CDATA[some stuff]]>

Eu observei que essa CDATAtag sempre aparece no começo e depois é seguida por algumas coisas.

Mas às vezes é usado, às vezes não é. Eu suponho que é para marcar que some stuffsão os "dados" que serão inseridos depois disso. Mas que tipo de dados são some stuff? Nada do que escrevo em tags XML é algum tipo de dado?

dontWatchMyProfile
fonte

Respostas:

951

CDATA significa Dados de caracteres e significa que os dados entre essas seqüências 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:

Isso significa que são dados esses quatro trechos 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>
Sean Vieira
fonte
35
Como um caractere da sequência CEND pode ser escapado?
Thomas Weller
23
Você precisa ter duas seções CDATA para concatenar o - ]]e >- veja esta resposta para os comos e os porquês.
45619 Vieira Sean
2
deve haver um novo caractere de linha entre o início do CDATA e os dados brutos?
Ben Sewards
2
Não há @BenSewards
Sean Vieira
5
Portanto, este pedaço de C-like código não poderia facilmente ser colocado em uma seção CDATA: if (a[b[c]]>10) { }.
Anders Tornblad 22/03/19
341

Uma seção CDATA é " uma seção do conteúdo do elemento que está marcada para o analisador interpretar como apenas dados de caracteres, não marcação " .

Sintaticamente, ele se comporta de maneira 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 o seguinte como um .xhtmlarquivo ( não .html ) e abra-o usando o FireFox ( não o Internet Explorer ) para ver a diferença entre o comentário e a seção CDATA; o comentário não aparecerá quando você olhar o documento em um navegador, enquanto a seção 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 ser observado nas seções CDATA é que elas não possuem codificação, portanto não há como incluir a string ]]>nelas. Qualquer dado de caractere que contenha ]]>terá que, até onde eu saiba, ser um nó de texto. Da mesma forma, da perspectiva da manipulação do DOM, você não pode criar uma seção CDATA que inclua ]]>:

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

Esse código de manipulação do DOM lançará uma exceção (no Firefox) ou resultará em um documento XML mal estruturado: http://jsfiddle.net/9NNHA/

Richard JP Le Guen
fonte
3
Então, por que "ý" não é permitido no CDATA?
bjan
10
@bjan - O que faz você pensar que é um personagem ilegal? Parece que você pode ter um problema de codificação.
Richard JP Le Guen
Abri o documento no IE, também estou usando o analisador MSXML, que o declarou como um caractere inválido. Eu tenho um xsd no qual é declarado como "type =" xs: string "". Está relacionado à codificação ou à versão xml?
bjan
CDATA é analisado e só intervalo válido de caracteres são permitidos aqui também, ele é usado para escapar blocos de texto contendo caracteres que seriam reconhecidos como marcação
bjan
1
Assim, poderíamos usar o CDATA para contrabandear um pouco de HTML no documento XML, para que o HTML não confunda a estrutura do documento XML e, em seguida, use o XSLT mais tarde para retirá-lo e cuspi-lo em um documento HTML que está sendo produzido.
Kaz
69

Um grande caso de uso: seu xml inclui um programa, como dados (por exemplo, um tutorial de página da web para Java). Nessa situação, seus dados incluem uma grande quantidade de caracteres que incluem '&' e '<', mas esses caracteres não devem ser xml.

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 esse código de um arquivo (ou incluindo-o em um pré-processador), é bom ter apenas os caracteres desejados no seu arquivo xml, sem confundi-los com tags / atributos XML. Como o @paary mencionou, outros usos comuns incluem quando você incorpora URLs que contêm e comercial. Por fim, mesmo que os dados contenham apenas alguns caracteres especiais, mas sejam muito longos (o texto de um capítulo, por exemplo), é bom não ter que codificar essas poucas entidades à medida que você edita seu arquivo xml. .

(Suspeito que todas as comparações com comentários sejam meio enganosas / inúteis.)

não-apenas-yeti
fonte
41

Uma vez eu tive que usar CDATA quando meu elemento xml precisava armazenar código HTML. Algo como

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

Portanto, CDATA significa que ele ignorará qualquer caractere que poderia ser interpretado como tag XML como <e> etc.

Octano
fonte
2
Não é "tag", mas elemento na primeira frase.
Ludovic Kuty
32

Os dados nele contidos não serão analisados ​​como XML e, como tal, não precisam ser XML válidos ou podem conter elementos que podem parecer XML, mas não são.

fbrereto
fonte
16

Da Wikipedia:

[Em] um documento XML ou entidade analisada externa, uma seção CDATA é uma seção do conteúdo do elemento que é marcada para o analisador interpretar como apenas dados de caracteres, não 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.

Chdid
fonte
13

Como outro exemplo de seu uso:

Se você possui um feed RSS (documento xml) e deseja incluir alguma codificação HTML básica na exibição da descrição, pode usar o CData para codificá-lo:

<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 RSS Reader extrai a descrição e renderiza o HTML no CDATA.

Nota - nem todas as tags HTML funcionam - acho que depende do leitor de RSS que você está usando.


E como uma explicação do motivo pelo qual este exemplo usa CData (e não as tags pubData e dc: creator apropriadas): isto é para exibição do site usando um widget RSS para o qual não temos controle de formatação real.

Isso nos permite especificar a altura e a posição da imagem incluída, formatar os nomes dos autores e a data corretamente e assim por diante, sem a necessidade de um novo widget. Isso também significa que posso criar um script e não precisar adicioná-los manualmente.

LadyCygnus
fonte
9

CDATA significa Dados de caracteres. Você pode usar isso para escapar de alguns caracteres que, de outra forma, serão tratados como XML regular. Os dados dentro disso não serão analisados. Por exemplo, se você deseja transmitir uma URL que contém &, pode usar o CDATA para fazer isso. Caso contrário, você receberá um erro, pois será analisado como XML regular.

paary
fonte
6

É usado para conter dados que, de outra forma, poderiam ser vistos como xml porque contêm determinados caracteres.

Dessa forma, os dados internos serão exibidos, mas não interpretados.

Ikke
fonte
5

Ele escapa uma string que não pode ser passada para XML como de costume:

Exemplo:

A cadeia contém "&".

Você não pode:

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

Portanto, você deve usar CDATA:

<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>
HoangYell
fonte
1

Geralmente usado para incorporar dados personalizados, como imagens ou dados de som em um documento XML.

Johan
fonte
3
Embora você possa colocar dados binários codificados em texto em uma seção CDATA, não é necessário, porque o CDATA não tem nada diretamente a ver com nada binário.
Joel Mueller
1

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

Diga por exemplo: - Você possui um xml que contém um objeto de pergunta / resposta. Esses campos abertos podem ter dados que não se enquadram estritamente no tipo de dados básico ou nos tipos de dados personalizados definidos por xml. Like - Esta é uma tag correta para o comentário xml? - Você pode ter um requisito para passá-lo como está sem ser interpretado pelo analisador xml como outro elemento filho. Aqui o Cdata vem em seu socorro. Ao declarar como Cdata, você está dizendo ao analisador que não trate os dados agrupados como um xml (embora possa parecer um)

aleatoriedade
fonte
0

Observe que a CDATAconstrução é necessária apenas se você colocar texto diretamente no arquivo de texto XML.

Ou seja, você só precisa usar CDATA se digitar manualmente ou criar programaticamente o texto XML diretamente.

Qualquer texto digitado usando uma API do processador DOM ou SimpleXML será automaticamente escapado para impedir a violação das regras de conteúdo XML.

Patanjali
fonte