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?

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>

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/


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


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.


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.


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.


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.


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.


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.


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>

1

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


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)


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.