it-swarm.com.de

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

Ich finde dieses seltsame CDATA -Tag häufig in XML -Dateien:

<![CDATA[some stuff]]>

Ich habe beobachtet, dass dieses CDATA -Tag immer am Anfang steht und dann von ein paar Sachen gefolgt wird.

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

944

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

Die wichtigsten Unterschiede zwischen CDATA und Kommentaren sind:

Dies bedeutet, dass diese drei XML-Ausschnitte 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>
895
Sean Vieira

Ein CDATA-Abschnitt ist " ein Abschnitt des Elementinhalts, der für den Parser als nur Zeichendaten, nicht als Markup, interpretiert werden soll. "

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, die folgende Datei als .xhtml -Datei ( not .html) zu speichern, und öffnen Sie sie mit FireFox ( not Internet Explorer ) um den Unterschied zwischen dem Kommentar und dem CDATA-Abschnitt zu sehen; Der Kommentar wird nicht angezeigt, wenn Sie sich das Dokument in einem Browser ansehen, während der CDATA-Abschnitt Folgendes ausführt:

<?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, sodass die Zeichenfolge ]]> nicht in sie eingeschlossen werden kann. Alle Zeichendaten, die ]]> enthalten, müssen meines Wissens stattdessen ein Textknoten sein. Ebenso können Sie aus Sicht der DOM-Manipulation keinen CDATA-Abschnitt erstellen, der ]]> 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/

328

Ein großer Anwendungsfall: Ihre XML-Datei enthält ein Programm als Daten (z. B. ein Web-Tutorial für Java). In dieser Situation enthalten Ihre Daten einen großen Teil der 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>

Insbesondere wenn Sie diesen Code aus einer Datei kopieren/einfügen (oder in einen Preprozessor einfügen), ist es hilfreich, nur die gewünschten Zeichen in Ihrer XML-Datei zu haben, ohne sie mit XML-Tags/Attributen zu verwechseln. Wie @paary bereits erwähnt hat, werden URLs, die kaufmännisches Und enthalten, häufig auch zum Einbetten verwendet. Selbst wenn die Daten nur wenige Sonderzeichen enthalten, die Daten jedoch sehr, sehr lang sind (z. B. der Text eines Kapitels), ist es hilfreich, diese wenigen Entitäten beim Bearbeiten Ihrer XML-Datei nicht ein- und auskodieren zu müssen .

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

66
not-just-yeti

Ich musste einmal CDATA verwenden, als mein XML-Element HTML-Code speichern musste. So etwas wie

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

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

38
Octane

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

29
fbrereto

Aus Wikipedia:

[In] einem XML-Dokument oder einer extern analysierten Entität ist ein CDATA-Abschnitt ein Abschnitt des Elementinhalts, der für den Parser als nur Zeichendaten, nicht als Markup, interpretiert wird.

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

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

12
Chdid

Als ein weiteres Beispiel für seine Verwendung:

Wenn Sie einen RSS-Feed (XML-Dokument) haben und einige grundlegende HTML-Codierungen in die Anzeige der Beschreibung aufnehmen möchten, können Sie ihn 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, warum in diesem Beispiel CData (und nicht die entsprechenden pubData- und dc: creator-Tags) verwendet werden: Dies ist für die Anzeige von Websites mit einem RSS-Widget vorgesehen, 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 ein neues Widget zu benötigen. Dies bedeutet auch, dass ich das Skript erstellen kann und sie nicht manuell hinzufügen muss.

11
LadyCygnus

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

8
paary

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

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

5
Ikke

Es wird eine Zeichenfolge ignoriert, 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>
3
HoangYell

Bei den Cdata handelt es sich um 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, die Frage/Antwort-Objekt eingekapselt hat. Solche offenen Felder können alle Daten enthalten, die nicht genau unter den Basisdatentyp oder den in XML definierten benutzerdefinierten Datentypen fallen. Like --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 weiteres untergeordnetes Element interpretiert zu werden. Hier kommt Cdata zu Ihrer Rettung. Indem Sie als Cdata deklarieren, teilen Sie dem Parser mit, dass die umschlossenen Daten nicht als XML behandelt werden sollen (auch wenn es so aussehen mag).

1
randomness

Wird normalerweise zum Einbetten benutzerdefinierter Daten wie Bilder oder Tondaten in ein XML-Dokument verwendet.

1
Johan