web-dev-qa-db-fra.com

Que signifie <! [CDATA []]> en XML?

Je trouve souvent cette étrange balise CDATA dans les fichiers XML:

<![CDATA[some stuff]]>

J'ai observé que cette balise CDATA vient toujours au début, puis est suivie de quelques éléments.

Mais parfois, il est utilisé, parfois non. Je suppose que c'est pour marquer que some stuff est la "donnée" qui sera insérée après cela. Mais quel genre de données est some stuff? Est-ce que tout ce que j'écris dans les balises XML n'est pas une sorte de données?

944

CDATA signifie Données de caractère et cela signifie que les données entre ces chaînes incluent des données que pourrait être interprété comme un balisage XML, mais ne devrait pas l'être.

Les principales différences entre CDATA et les commentaires sont les suivantes:

Cela signifie que ces trois extraits de code XML d'un document bien formé sont les suivants:

<!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>
895
Sean Vieira

Une section CDATA est " ne section du contenu de l'élément qui doit être interprétée par l'analyseur comme étant uniquement des données de caractère, pas de balisage. "

Syntaxiquement, il se comporte comme un commentaire:

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

... mais cela fait toujours partie du document:

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

Essayez d’enregistrer le fichier suivant en tant que fichier .xhtml ( et non .html) et ouvrez-le à l’aide de FireFox ( pas Internet Explorer ) pour voir la différence entre le commentaire et la section CDATA; le commentaire n'apparaîtra pas lorsque vous consulterez le document dans un navigateur, tandis que la section 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>

Il est intéressant de noter que les sections CDATA n’ont pas d’encodage. Il n’ya donc aucun moyen d’y inclure la chaîne ]]>. Toutes les données de caractère contenant ]]> devront, à ma connaissance, être un nœud de texte. De même, du point de vue de la manipulation du DOM, vous ne pouvez pas créer de section CDATA incluant ]]>:

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

Ce code de manipulation DOM générera une exception (dans Firefox) ou produira un document XML mal structuré: http://jsfiddle.net/9NNHA/

328

Un grand cas d’utilisation: votre xml inclut un programme, sous forme de données (par exemple, un tutoriel de page Web pour Java). Dans cette situation, vos données incluent un grand nombre de caractères, tels que '&' et '<', mais ces caractères ne sont pas censés être du xml.

Comparer:

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

avec

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

Surtout si vous copiez/collez ce code à partir d'un fichier (ou l'incluant, dans un pré-processeur), il est agréable de simplement avoir les caractères que vous voulez dans votre fichier xml, sans les confondre avec les balises/attributs XML. Comme @paary mentionné, les autres utilisations courantes incluent l'intégration d'URL contenant des esperluettes. Enfin, même si les données ne contiennent que quelques caractères spéciaux mais que les données sont très longues (le texte d'un chapitre, par exemple), il est agréable de ne pas avoir à coder/décoder ces quelques entités lorsque vous modifiez votre fichier xml. .

(Je soupçonne que toutes les comparaisons avec les commentaires sont un peu trompeuses/inutiles.)

66
not-just-yeti

Une fois, j'ai dû utiliser CDATA lorsque mon élément xml avait besoin de stocker du code HTML. Quelque chose comme

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

Donc CDATA signifie qu’il ignorera tout caractère qui pourrait autrement être interprété comme une balise XML comme <et> etc.

38
Octane

Les données qui y sont contenues ne seront pas analysées en tant que XML et ne doivent donc pas obligatoirement être des fichiers XML valides ou peuvent contenir des éléments pouvant sembler être du XML mais ne le sont pas.

29
fbrereto

De Wikipedia:

[Dans] un document XML ou une entité analysée externe, une section CDATA est une section de contenu d'élément qui est marquée pour que l'analyseur puisse être interprétée comme étant uniquement des données de caractères, pas de balisage.

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

Ainsi: le texte à l'intérieur de CDATA est vu par l'analyseur mais uniquement sous forme de caractères et non sous forme de nœuds XML.

12
Chdid

Autre exemple d'utilisation:

Si vous avez un flux RSS (document XML) et souhaitez inclure un codage HTML de base dans l'affichage de la description, vous pouvez utiliser CData pour le coder:

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

Le lecteur RSS extrait la description et rend le code HTML dans le CDATA.

Remarque - toutes les balises HTML ne fonctionnent pas - je pense que cela dépend du lecteur RSS que vous utilisez.


Et pour expliquer pourquoi cet exemple utilise CData (et non les balises pubData et dc: creator appropriées): il s’agit de l’affichage de sites Web à l’aide d’un widget RSS pour lequel nous n’avons aucun contrôle de formatage réel.

Cela nous permet de spécifier la hauteur et la position de l'image incluse, de formater correctement les noms d'auteur et la date, etc., sans avoir besoin d'un nouveau widget. Cela signifie aussi que je peux écrire ceci et ne pas avoir à les ajouter à la main.

11
LadyCygnus

CDATA signifie Caractère Données. Vous pouvez l'utiliser pour échapper à certains caractères qui, sinon, seront traités comme du XML standard. Les données qu'il contient ne seront pas analysées. Par exemple, si vous souhaitez transmettre une URL contenant &, vous pouvez utiliser CDATA pour le faire. Sinon, vous obtiendrez une erreur car il sera analysé en tant que XML normal.

8
paary

Il est utilisé pour contenir des données qui pourraient autrement être considérées comme XML, car il contient certains caractères.

De cette façon, les données à l'intérieur seront affichées, mais pas interprétées.

5
Ikke

Cela échappe à une chaîne qui ne peut pas être passée à XML comme d'habitude:

Exemple:

La chaîne contient "&".

Vous ne pouvez pas:

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

Par conséquent, vous devez utiliser CDATA:

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

Le Cdata est une donnée que vous voudrez peut-être transmettre à un analyseur XML et qui ne sera toujours pas interprétée comme un xml.

Dites par exemple: - Vous avez un xml qui encapsule un objet question/réponse. Ces champs ouverts peuvent contenir des données qui ne relèvent pas strictement du type de données de base ou des types de données personnalisés définis par xml. Comme --Est-ce une balise correcte pour un commentaire xml? .-- Vous pouvez être obligé de le transmettre tel quel sans être interprété par l'analyseur xml comme un autre élément enfant. Ici, Cdata vient à votre secours. En déclarant que Cdata, vous dites à l'analyseur syntaxique de ne pas traiter les données enveloppées comme un xml (bien que cela puisse en ressembler)

1
randomness

Habituellement utilisé pour incorporer des données personnalisées, telles que des images ou des données audio dans un document XML.

1
Johan