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

1014

Ich finde dieses seltsame CDATATag oft in XMLDateien:

<![CDATA[some stuff]]>

Ich habe beobachtet, dass dieses CDATATag immer am Anfang steht und dann einige Dinge folgen.

Aber manchmal wird es verwendet, manchmal nicht. Ich gehe davon aus, dass some stuffes sich um die "Daten" handelt, die danach eingefügt werden. Aber was sind Daten some stuff? Ist nichts, was ich in XML-Tags schreibe, eine Art von Daten?

dontWatchMyProfile
quelle

Antworten:

951

CDATA steht für Character Data und bedeutet, dass die Daten zwischen diesen Zeichenfolgen Daten enthalten, die als XML-Markup interpretiert werden könnten , aber nicht sein sollten.

Die Hauptunterschiede zwischen CDATA und Kommentaren sind:

Dies 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>
Sean Vieira
quelle
35
Wie kann ein Zeichen der CEND-Sequenz maskiert werden?
Thomas Weller
23
Sie müssen zwei CDATA-Abschnitte haben, um das ]]und das zu verketten >- siehe diese Antwort für das Wie und Warum.
Sean Vieira
2
Muss zwischen dem CDATA-Start und den Rohdaten ein neues Zeilenzeichen stehen?
Ben Sewards
2
Nein gibt es nicht @BenSewards
Sean Vieira
5
Dieser C-ähnliche Code konnte also nicht einfach in einen CDATA-Abschnitt eingefügt werden : if (a[b[c]]>10) { }.
Anders Tornblad
341

Ein CDATA-Abschnitt ist " ein Abschnitt des Elementinhalts, der markiert ist, damit der Parser ihn nur als Zeichendaten und nicht als Markup interpretiert. "

Syntaktisch verhält es 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, Folgendes als .xhtmlDatei zu speichern ( nicht .html ) und öffnen Sie es mit FireFox ( nicht Internet Explorer ), um den Unterschied zwischen dem Kommentar und dem CDATA-Abschnitt festzustellen . Der Kommentar wird nicht angezeigt, wenn Sie das Dokument in einem Browser anzeigen, während der CDATA-Abschnitt:

<?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 Codierung haben und daher keine Möglichkeit besteht, die Zeichenfolge ]]>in sie aufzunehmen. Alle Zeichendaten, die enthalten ]]>, müssen - soweit ich weiß - stattdessen ein Textknoten sein. Ebenso können Sie 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 DOM-Manipulationscode löst entweder eine Ausnahme aus (in Firefox) oder führt zu einem schlecht strukturierten XML-Dokument: http://jsfiddle.net/9NNHA/

Richard JP Le Guen
quelle
3
Warum ist "ý" dann in CDATA nicht erlaubt?
Bjan
10
@bjan - Warum denkst du, dass das ein illegaler Charakter ist? Klingt so, als hätten Sie möglicherweise ein Codierungsproblem.
Richard JP Le Guen
Ich habe das Dokument im IE geöffnet und verwende auch den MSXML-Parser, der es als ungültiges Zeichen deklariert hat. Ich habe eine xsd, in der es als "type =" xs: string "" deklariert ist. Bezieht es sich auf die Codierung oder die XML-Version?
Bjan
CDATA wird analysiert und auch hier ist nur ein gültiger Zeichenbereich zulässig. Es wird verwendet, um Textblöcken zu entgehen, die Zeichen enthalten, die andernfalls als Markup erkannt würden
bjan
1
Wir könnten also CDATA verwenden, um etwas HTML in das XML-Dokument zu schmuggeln, damit der HTML-Code die XML-Dokumentstruktur nicht verwechselt, und später XSLT verwenden, um es herauszuziehen und in ein HTML-Dokument zu spucken, das ausgegeben wird.
Kaz
69

Ein großer Anwendungsfall: Ihre XML enthält ein Programm als Daten (z. B. ein Webseiten-Tutorial für Java). In dieser Situation enthalten Ihre Daten einen großen Teil der Zeichen, die '&' und '<' enthalten, aber diese Zeichen sind nicht als 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>

Insbesondere wenn Sie diesen Code aus einer Datei kopieren / einfügen (oder in einen Vorprozessor einfügen), ist es schön, nur die gewünschten Zeichen in Ihrer XML-Datei zu haben, ohne sie mit XML-Tags / -Attributen zu verwechseln. Wie bei @paary erwähnt, können Sie auch häufig URLs einbetten, die kaufmännisches Und enthalten. Selbst wenn die Daten nur wenige Sonderzeichen enthalten, die Daten jedoch sehr, sehr lang sind (z. B. der Text eines Kapitels), ist es schön, dass Sie diese wenigen Entitäten beim Bearbeiten Ihrer XML-Datei nicht dekodieren müssen .

(Ich vermute, dass alle Vergleiche mit Kommentaren irgendwie irreführend / nicht hilfreich sind.)

nicht nur Yeti
quelle
41

Ich musste einmal CDATA verwenden, wenn 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 andernfalls als XML-Tag wie <und> usw. interpretiert werden könnten.

Oktan
quelle
2
Nicht "Tag", sondern Element im ersten Satz.
Ludovic Kuty
32

Die darin enthaltenen Daten werden nicht als XML analysiert und müssen daher kein gültiges XML sein oder können Elemente enthalten, die als XML erscheinen, dies jedoch nicht sind.

fbrereto
quelle
16

Aus Wikipedia:

[In] einem XML-Dokument oder einer externen analysierten Entität ist ein CDATA-Abschnitt ein Abschnitt des Elementinhalts, der markiert ist, damit der Parser ihn nur als Zeichendaten und nicht als Markup interpretiert.

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

Also: Text in CDATA wird vom Parser gesehen, aber nur als Zeichen, nicht als XML-Knoten.

Chdid
quelle
13

Als weiteres Beispiel für seine Verwendung:

Wenn Sie einen RSS-Feed (XML-Dokument) haben und eine grundlegende HTML-Codierung in die Anzeige der Beschreibung aufnehmen möchten, können Sie diese mit CData codieren:

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

Der RSS-Reader zieht die Beschreibung ein und rendert den HTML-Code innerhalb der CDATA.

Hinweis - nicht alle HTML-Tags funktionieren - Ich denke, das hängt vom verwendeten RSS-Reader ab.


Und als Erklärung dafür, warum in diesem Beispiel CData verwendet werden (und nicht die entsprechenden Tags pubData und dc: creator): Dies ist für die Website-Anzeige mit einem RSS-Widget gedacht, für das wir keine wirkliche Formatierungssteuerung haben.

Auf diese Weise können wir die Höhe und Position des enthaltenen Bilds angeben, die Namen und das Datum des Autors korrekt formatieren usw., ohne dass ein neues Widget erforderlich ist. Es bedeutet auch, dass ich dies skripten kann und sie nicht von Hand hinzufügen muss.

LadyCygnus
quelle
9

CDATA steht für Character Data. Sie können dies verwenden, um einige Zeichen zu maskieren, die andernfalls als reguläres XML behandelt werden. Die darin enthaltenen Daten werden nicht analysiert. Wenn Sie beispielsweise eine darin enthaltene URL übergeben möchten &, können Sie dazu CDATA verwenden. Andernfalls wird eine Fehlermeldung angezeigt, da diese als reguläres XML analysiert wird.

paary
quelle
6

Es wird verwendet, um Daten zu enthalten, die andernfalls als XML angesehen werden könnten, da sie bestimmte Zeichen enthalten.

Auf diese Weise werden die darin enthaltenen Daten angezeigt, aber nicht interpretiert.

Ikke
quelle
5

Es entgeht eine Zeichenfolge, die nicht wie gewohnt an XML übergeben werden kann:

Beispiel:

Die Zeichenfolge enthält "&".

Du kannst nicht:

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

Daher müssen Sie CDATA verwenden:

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

Wird normalerweise zum Einbetten von benutzerdefinierten Daten wie Bild- oder Audiodaten in ein XML-Dokument verwendet.

Johan
quelle
3
Obwohl Sie textcodierte Binärdaten in einen CDATA-Abschnitt einfügen könnten, müssen Sie dies nicht tun, da CDATA nichts direkt mit Binärdaten zu tun hat.
Joel Mueller
1

Die Cdata sind Daten, die Sie möglicherweise an einen XML-Parser übergeben möchten und die immer noch nicht als XML interpretiert werden.

Sagen Sie zum Beispiel: - Sie haben eine XML-Datei, die ein Frage- / Antwortobjekt enthält. Solche offenen Felder können Daten enthalten, die nicht ausschließlich unter den Basisdatentyp oder die in XML definierten benutzerdefinierten Datentypen fallen. Gefällt mir - Ist dies ein korrektes Tag für einen XML-Kommentar? - Möglicherweise müssen Sie es so übergeben, wie es ist, ohne vom XML-Parser als ein anderes untergeordnetes Element interpretiert zu werden. Hier kommt Cdata zu Ihrer Rettung. Wenn Sie als Cdata deklarieren, teilen Sie dem Parser mit, dass die umschlossenen Daten nicht als XML behandelt werden sollen (obwohl sie möglicherweise wie eine aussehen).

Zufälligkeit
quelle
0

Notiere dass der CDATA Konstrukt nur benötigt wird, wenn Text direkt in die XML-Textdatei eingefügt wird.

Das heißt, Sie müssen nur verwenden, CDATAwenn Sie den XML-Text direkt von Hand eingeben oder programmgesteuert erstellen.

Jeder Text, der mit einer DOM-Prozessor-API oder SimpleXML eingegeben wird, wird automatisch maskiert, um zu verhindern, dass XML-Inhaltsregeln verletzt werden.

Patanjali
quelle