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

1014

Je trouve souvent cette étrange CDATAbalise dans les XMLfichiers:

<![CDATA[some stuff]]>

J'ai observé que cette CDATAbalise vient toujours au début, puis suivie de quelques trucs.

Mais parfois, il est utilisé, parfois non. Je suppose que c'est pour marquer que ce some stuffsont les "données" qui seront insérées après cela. Mais de quel type de données s'agit-il some stuff? Tout ce que j'écris dans les balises XML n'est-il pas une sorte de données?

dontWatchMyProfile
la source

Réponses:

951

CDATA signifie Character Data et cela signifie que les données entre ces chaînes incluent des données qui pourraient être interprétées comme du balisage XML, mais ne devraient pas l'être.

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

Cela signifie étant donné ces quatre extraits de code XML d'un document bien formé:

<!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
la source
35
Comment échapper un personnage de la séquence CEND?
Thomas Weller
23
Vous devez avoir deux sections CDATA pour concaténer le ]]et le >- voir cette réponse pour le comment et le pourquoi.
Sean Vieira
2
faut-il qu'il y ait un nouveau caractère de ligne entre le démarrage CDATA et les données brutes?
Ben Sewards
2
Non, il n'y a pas @BenSewards
Sean Vieira
5
Donc , ce morceau de C comme code ne pourrait facilement être mis dans une section CDATA: if (a[b[c]]>10) { }.
Anders Tornblad
341

Une section CDATA est " une section de contenu d'élément qui est marquée pour que l'analyseur interprète comme uniquement des données de caractères, pas de balisage. "

Syntaxiquement, il se comporte de manière similaire à 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 ce qui suit en tant que .xhtmlfichier ( pas .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 regardez 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>

Quelque chose à noter avec les sections CDATA est qu'elles n'ont pas d'encodage, donc il n'y a aucun moyen d'y inclure la chaîne ]]>. Toutes les données de caractères qui contiennent ]]>devront - pour autant que je sache - être un nœud de texte à la place. De même, du point de vue de la manipulation DOM, vous ne pouvez pas créer une section CDATA qui comprend ]]>:

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

Ce code de manipulation DOM va lever une exception (dans Firefox) ou entraîner un document XML mal structuré: http://jsfiddle.net/9NNHA/

Richard JP Le Guen
la source
3
Alors pourquoi "ý" n'est pas autorisé dans CDATA?
bjan
11
@bjan - Qu'est-ce qui vous fait penser que c'est un personnage illégal? On dirait que vous pourriez avoir un problème d'encodage.
Richard JP Le Guen
J'ai ouvert le document dans IE, j'utilise également l'analyseur MSXML qui l'a déclaré comme un caractère invalide. J'ai un xsd dans lequel il est déclaré comme "type =" xs: string "". Est-ce lié à l'encodage ou à la version xml?
bjan
CDATA est analysé et seule une plage de caractères valide est autorisée ici également, il est utilisé pour échapper des blocs de texte contenant des caractères qui seraient autrement reconnus comme du balisage
bjan
1
Nous pourrions donc utiliser CDATA pour faire passer du HTML dans le document XML, afin que le HTML ne perturbe pas la structure du document XML, puis utiliser XSLT plus tard pour le retirer et le cracher dans un document HTML en cours de sortie.
Kaz
69

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 gros morceau de caractères qui incluent «&» et «<», mais ces caractères ne sont pas censés être 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 que vous l'incluez dans un pré-processeur), il est agréable d'avoir simplement les caractères que vous voulez dans votre fichier xml, sans les confondre avec des balises / attributs XML. Comme mentionné @paary, d'autres utilisations courantes incluent lorsque vous incorporez des 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 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.)

pas-juste-yeti
la source
41

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>

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

Octane
la source
2
Pas "tag" mais élément dans la première phrase.
Ludovic Kuty
32

Les données qui y sont contenues ne seront pas analysées en tant que XML et, en tant que telles, ne doivent pas nécessairement être du XML valide ou peuvent contenir des éléments qui peuvent sembler être du XML mais ne le sont pas.

fbrereto
la source
16

De Wikipédia:

[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 interprète uniquement les données de caractères, pas le balisage.

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

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

Chdid
la source
13

Comme autre exemple de son utilisation:

Si vous avez un flux RSS (document xml) et que vous 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 affiche 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): c'est pour l'affichage du site Web en utilisant 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 également que je peux écrire ceci sans avoir à les ajouter à la main.

LadyCygnus
la source
9

CDATA est l'abréviation de Character Data. Vous pouvez l'utiliser pour échapper certains caractères qui autrement seraient 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 qui la contient &, vous pouvez utiliser CDATA pour le faire. Sinon, vous obtiendrez une erreur car elle sera analysée en XML standard.

paary
la source
6

Il est utilisé pour contenir des données qui pourraient autrement être vues 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.

Ikke
la source
5

Il échappe une chaîne qui ne peut pas être passée au 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>
HoangYell
la source
1

Généralement utilisé pour incorporer des données personnalisées, comme des images ou des données sonores dans un document XML.

Johan
la source
3
Bien que vous puissiez mettre des données binaires encodées en texte dans une section CDATA, vous n'êtes pas obligé, car CDATA n'a rien à voir directement avec quoi que ce soit binaire.
Joel Mueller
1

Le Cdata est une donnée que vous voudrez peut-être passer à un analyseur xml et 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 devrez peut-être 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 en tant que Cdata, vous dites à l'analyseur de ne pas traiter les données enveloppées comme un xml (bien qu'il puisse en ressembler un)

hasard
la source
0

Notez que la CDATAconstruction n'est nécessaire que si vous placez du texte directement dans le fichier texte XML.

Autrement dit, vous ne devez l'utiliser que CDATAsi vous tapez à la main ou si vous créez directement le texte XML par programmation.

Tout texte saisi à l'aide d'une API de processeur DOM ou de SimpleXML sera automatiquement échappé pour éviter d'exécuter une infraction aux règles de contenu XML.

Patanjali
la source