1098 votes

Que signifie <![CDATA[]]> au moyen XML ?

Souvent, je trouve cette balise CDATA étrange dans des fichiers XML :

J’ai observé que cette balise CDATA vient toujours au début et puis suivie par quelques trucs.

Mais parfois, il est utilisé, il n’est pas. Je suppose que c’est pour marquer que certaines « données » seront insérées après cela. Mais quel genre de « données » ? N’est pas tout ce que j’écris dans XML tags une sorte de « données » ?

1023voto

Sean Vieira Points 47080

CDATA représente les Données de Caractères et cela signifie que les données entre ces balises de données comprend des données qui pourrait être interprété comme de balisage XML, mais ne devrait pas être.

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

  • Comme Richard souligne, CDATA fait toujours partie du document, tandis qu'un commentaire n'est pas.
  • Dans CDATA vous ne pouvez pas inclure la chaîne ]]> (CDEnd), tandis que dans un commentaire -- n'est pas valide.
  • Paramètre Entité références ne sont pas reconnus à l'intérieur de commentaires.

Cela signifie que, au vu de ces trois extraits de XML à partir d'un bien formé document:

<!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 it I must escape one of the
brackets or the greater-than sign).
]]>

350voto

Richard JP Le Guen Points 13306

Une section CDATA est "une section de l'élément de contenu qui est marqué pour l'analyseur à interpréter en tant que seul personnage de données, pas de balisage."

Du point de vue syntaxique, il se comporte de façon 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 il est encore une 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 l' .xhtml le fichier (pas .html) et l'ouvrir avec FireFox (pas Internet Explorer) pour voir la différence entre le commentaire et la section CDATA; le commentaire ne s'affiche 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 à prendre note de avec des sections CDATA est qu'ils n'ont pas l'encodage, donc il n'y a aucun moyen d'inclure la chaîne ]]> . Toutes les données de caractères qui contient ]]> devront - autant que je sache - être un nœud de texte à la place. De même, à partir d'une manipulation du DOM point de vue, vous ne pouvez pas créer une section CDATA, qui inclut ]]>:

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

Cette manipulation du DOM code de jeter une exception (dans Firefox) ou le résultat dans un mal structuré document XML: http://jsfiddle.net/9NNHA/

72voto

not-just-yeti Points 3280

Un grand de cas d'utilisation: votre xml inclut un programme, comme les données (par exemple, une page web tutoriel pour Java). Dans cette situation, vos données comprend une grande partie, de caractères qui incluent '&' et '<' mais ces caractères ne sont pas destinées à ê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 êtes un copier/coller de ce code à partir d'un fichier (ou notamment, dans un pré-processeur), il est agréable d'avoir juste les caractères que vous voulez dans votre fichier xml, w/o en les confondant avec des balises XML/attributs. @Paary mentionnés, d'autres utilisations courantes incluent lorsque vous imbriquez les Url qui contiennent des arobases. Enfin, même si les données ne contient que quelques caractères spéciaux, mais les données sont très très longtemps (le texte d'un chapitre, par exemple), c'est agréable de ne pas avoir à en/de codage de ces quelques entités que vous modifiez votre fichier xml.

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

34voto

fbrereto Points 21711

Les données qui y figurent ne sera pas analysées en tant que XML et comme tel n’a pas besoin d’être un code XML valide ou peut contenir des éléments qui peuvent apparaître comme XML, mais ne sont pas.

11voto

paary Points 310

CDATA est synonyme de données de type caractère. Vous pouvez utiliser ceci pour échapper certains caractères qui, autrement, seront traitées comme XML ordinaire. Les données à l’intérieur de cela ne seront pas analysées. Par exemple, si vous souhaitez passer une URL qui contient `` dans ce document, vous pouvez utiliser CDATA pour le faire. Sinon, vous obtiendrez une erreur qu’il va être analysé comme XML ordinaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X