1261 Stimmen

Was bedeutet <![CDATA[]]> in XML?

Ich finde das oft seltsam CDATA Tag einfügen XML Dateien:

<![CDATA[some stuff]]>

Ich habe festgestellt, dass dies CDATA Tag kommt immer am Anfang, und dann folgen einige Dinge.

Aber manchmal wird sie genutzt, manchmal nicht. Ich nehme an, es soll markieren, dass some stuff sind die "Daten", die danach eingefügt werden. Aber welche Art von Daten ist some stuff ? Ist nicht alles, was ich in XML-Tags schreibe, eine Art von Daten?

1213voto

Sean Vieira Punkte 147654

CDATA steht für Zeichen-Daten und es bedeutet, dass die Daten zwischen diesen Zeichenketten Daten enthalten, die könnte als XML-Auszeichnung interpretiert werden, was aber nicht der Fall sein sollte.

Die wichtigsten Unterschiede zwischen CDATA und Kommentaren sind:

Das bedeutet, dass diese vier XML-Schnipsel aus einem wohlgeformten Dokument stammen:

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

369voto

Richard JP Le Guen Punkte 27575

Ein CDATA-Abschnitt ist " ein Abschnitt des Elementinhalts, der für den Parser so gekennzeichnet ist, dass er nur als Zeichendaten und nicht als Markup interpretiert wird. "

Syntaktisch verhält er sich ähnlich wie ein Kommentar:

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

... aber es ist immer noch Teil des Dokuments:

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

Versuchen Sie, die folgende Datei als .xhtml Datei ( no .html ) und öffnen Sie es mit FireFox ( nicht Internet Explorer ), um den Unterschied zwischen dem Kommentar und dem CDATA-Abschnitt zu sehen; der Kommentar wird nicht angezeigt, wenn Sie das Dokument in einem Browser betrachten, der CDATA-Abschnitt hingegen schon:

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

Bei CDATA-Abschnitten ist zu beachten, dass sie keine Kodierung haben, so dass es keine Möglichkeit gibt, die Zeichenfolge ]]> in ihnen. Alle Zeichendaten, die Folgendes enthalten ]]> muss - soweit ich weiß - stattdessen ein Textknoten sein. Ebenso kann man aus Sicht der DOM-Manipulation keinen CDATA-Abschnitt erstellen, der Folgendes enthält ]]> :

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

Dieser Code zur DOM-Manipulation löst entweder eine Ausnahme aus (in Firefox) oder führt zu einem schlecht strukturierten XML-Dokument: http://jsfiddle.net/9NNHA/

83voto

not-just-yeti Punkte 17196

Ein wichtiger Anwendungsfall: Ihre Xml-Datei enthält ein Programm als Daten (z. B. ein Web-Tutorial für Java). In diesem Fall enthalten Ihre Daten einen großen Teil von Zeichen, die '&' und '<' enthalten, aber diese Zeichen sind nicht für XML gedacht.

Vergleichen Sie:

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

mit

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

Vor allem, wenn Sie diesen Code aus einer Datei kopieren/einfügen (oder ihn in einen Präprozessor einbinden), ist es schön, einfach die gewünschten Zeichen in Ihrer Xml-Datei zu haben, ohne sie mit XML-Tags/Attributen zu verwechseln. Wie @paary bereits erwähnt hat, gibt es weitere häufige Verwendungszwecke, z. B. beim Einbetten von URLs, die Ampersands enthalten. Und selbst wenn die Daten nur wenige Sonderzeichen enthalten, aber sehr lang sind (z. B. der Text eines Kapitels), ist es schön, wenn man diese wenigen Entitäten beim Bearbeiten der XML-Datei nicht ver-/entschlüsseln muss.

(Ich vermute, dass all die Vergleiche mit Kommentaren irgendwie irreführend/unnützig sind).

53voto

Octane Punkte 1150

Ich musste einmal CDATA verwenden, als mein Xml-Element HTML-Code speichern musste. Etwas wie

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

CDATA bedeutet also, dass alle Zeichen ignoriert werden, die sonst als XML-Tag wie < und > usw. interpretiert werden könnten.

37voto

fbrereto Punkte 34770

Die darin enthaltenen Daten werden nicht als XML geparst und müssen daher kein gültiges XML sein oder können Elemente enthalten, die wie XML aussehen, es aber nicht sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X