Cosa significa <! [CDATA []]> in XML?


1014

Trovo spesso questo strano CDATAtag nei XMLfile:

<![CDATA[some stuff]]>

Ho osservato che questo CDATAtag arriva sempre all'inizio, quindi seguito da alcune cose.

Ma a volte viene utilizzato, a volte no. Presumo sia per contrassegnare che some stuffsono i "dati" che verranno inseriti successivamente. Ma che tipo di dati è some stuff? Qualcosa che scrivo nei tag XML non è una sorta di dati?

Risposte:


951

CDATA sta per Character Data e significa che i dati tra queste stringhe includono dati che potrebbero essere interpretati come markup XML, ma non dovrebbero esserlo.

Le principali differenze tra CDATA e commenti sono:

Ciò significa che dati questi quattro frammenti di XML da un documento ben formato:

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

35
Come si può sfuggire a un personaggio della sequenza CEND?
Thomas Weller,

23
Devi concedere due sezioni CDATA per concatenare il ]]e il >- vedi questa risposta per come e perché.
Sean Vieira,

2
deve esserci un nuovo carattere di linea tra l'avvio di CDATA e i dati non elaborati?
Ben Sewards,

2
No, non c'è @BenSewards
Sean Vieira,

5
Quindi, questo pezzo di C-come il codice potrebbe non facilmente essere messo in una sezione CDATA: if (a[b[c]]>10) { }.
Anders Tornblad,

341

Una sezione CDATA è " una sezione del contenuto dell'elemento contrassegnata per il parser da interpretare come solo dati di carattere, non markup " .

Sintatticamente, si comporta in modo simile a un commento:

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

... ma fa ancora parte del documento:

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

Prova a salvare quanto segue come .xhtmlfile ( non .html ) e aprilo utilizzando FireFox ( non Internet Explorer ) per vedere la differenza tra il commento e la sezione CDATA; il commento non apparirà quando guarderai il documento in un browser, mentre la sezione 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>

Qualcosa da prendere in considerazione con le sezioni CDATA è che non hanno codifica, quindi non c'è modo di includere la stringa ]]>in esse. Tutti i dati sui personaggi che contiene ]]>dovranno invece - per quanto ne so - essere un nodo di testo. Allo stesso modo, dal punto di vista della manipolazione del DOM non è possibile creare una sezione CDATA che includa ]]>:

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

Questo codice di manipolazione DOM genererà un'eccezione (in Firefox) o genererà un documento XML mal strutturato: http://jsfiddle.net/9NNHA/


3
Allora perché "ý" non è consentito in CDATA?
bjan,

10
@bjan - Cosa ti fa pensare che sia un personaggio illegale? Sembra che potresti avere un problema di codifica.
Richard JP Le Guen,

Ho aperto il documento in IE, sto anche usando il parser MSXML che lo ha dichiarato come carattere non valido. Ho un xsd in cui è dichiarato come "type =" xs: string "". È correlato alla codifica o alla versione xml?
bjan,

CDATA viene analizzato e solo qui è consentito solo un intervallo valido di caratteri, viene utilizzato per sfuggire a blocchi di testo contenenti caratteri che altrimenti verrebbero riconosciuti come markup
bjan,

1
Quindi potremmo usare CDATA per trasferire un po 'di HTML nel documento XML, in modo che l'HTML non confonda la struttura del documento XML, e quindi utilizzare XSLT in seguito per estrarlo e sputarlo in un documento HTML che viene generato.
Kaz,

69

Un grande caso d'uso: il tuo xml include un programma, come dati (ad esempio un tutorial di pagine Web per Java). In quella situazione i tuoi dati includono una grande quantità di caratteri che includono '&' e '<' ma quei caratteri non sono pensati per essere xml.

Confrontare:

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

con

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

Soprattutto se stai copiando / incollando questo codice da un file (o includendolo, in un pre-processore), è bello avere solo i caratteri che desideri nel tuo file xml, senza confonderli con tag / attributi XML. Come accennato @paary, altri usi comuni includono quando si incorporano URL che contengono e commerciali. Infine, anche se i dati contengono solo pochi caratteri speciali ma i dati sono molto lunghi (il testo di un capitolo, diciamo), è bello non dover codificare / decodificare quelle poche entità mentre modifichi il tuo file xml .

(Sospetto che tutti i confronti con i commenti siano in qualche modo fuorvianti / inutili.)


41

Una volta ho dovuto usare CDATA quando il mio elemento xml aveva bisogno di memorizzare il codice HTML. Qualcosa di simile a

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

Quindi CDATA significa che ignorerà qualsiasi carattere che potrebbe altrimenti essere interpretato come tag XML come <e> ecc.


2
Non "tag" ma elemento nella prima frase.
Ludovic Kuty,

32

I dati in essi contenuti non verranno analizzati come XML e come tali non devono essere XML validi o possono contenere elementi che possono apparire come XML ma non lo sono.


16

Da Wikipedia:

[In] un documento XML o entità analizzata esterna, una sezione CDATA è una sezione del contenuto dell'elemento contrassegnata per il parser da interpretare come solo dati carattere, non markup.

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

Pertanto: il testo all'interno di CDATA viene visualizzato dal parser ma solo come caratteri non come nodi XML.


13

Come altro esempio del suo utilizzo:

Se si dispone di un feed RSS (documento xml) e si desidera includere una codifica HTML di base nella visualizzazione della descrizione, è possibile utilizzare CData per codificarlo:

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

Il lettore RSS inserisce la descrizione e esegue il rendering dell'HTML all'interno del CDATA.

Nota: non tutti i tag HTML funzionano, penso che dipenda dal lettore RSS che stai utilizzando.


E come spiegazione del perché questo esempio usa CData (e non i pubData e dc: tag creator appropriati): questo è per la visualizzazione di siti Web usando un widget RSS per il quale non abbiamo un vero controllo di formattazione.

Questo ci consente di specificare l'altezza e la posizione dell'immagine inclusa, formattare correttamente i nomi e la data dell'autore e così via, senza la necessità di un nuovo widget. Significa anche che posso scrivere questo script e non devo aggiungerli manualmente.


9

CDATA sta per Character Data. Puoi usarlo per sfuggire ad alcuni caratteri che altrimenti verranno trattati come XML normale. I dati al suo interno non verranno analizzati. Ad esempio, se si desidera passare un URL che contiene &al suo interno, è possibile utilizzare CDATA per farlo. In caso contrario, verrà visualizzato un errore poiché verrà analizzato come XML normale.


6

È usato per contenere dati che altrimenti potrebbero essere visti come xml perché contiene determinati caratteri.

In questo modo i dati all'interno verranno visualizzati, ma non interpretati.


5

Esce da una stringa che non può essere passata a XML come al solito:

Esempio:

La stringa contiene "&" al suo interno.

Non puoi:

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

Pertanto, è necessario utilizzare CDATA:

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

1

Solitamente utilizzato per incorporare dati personalizzati, come immagini o dati audio in un documento XML.


3
Sebbene sia possibile inserire dati binari con codifica di testo in una sezione CDATA, non è necessario, poiché CDATA non ha nulla a che fare direttamente con i file binari.
Joel Mueller,

1

Cdata è un dato che potresti voler passare a un parser xml e che comunque non viene interpretato come un xml.

Di 'ad esempio: - Hai un xml che ha incapsulato l'oggetto domanda / risposta. Tali campi aperti possono contenere qualsiasi dato che non rientri strettamente nel tipo di dati di base o nei tipi di dati personalizzati definiti xml. Mi piace - È un tag corretto per il commento XML? .-- Potrebbe essere necessario passarlo così com'è senza essere interpretato dal parser xml come un altro elemento figlio. Qui Cdata viene in tuo soccorso. Dichiarando come Cdata stai dicendo al parser di non trattare i dati racchiusi in un file XML (anche se può sembrare come uno)


0

Si noti che il CDATAcostrutto è necessario solo se si inserisce il testo direttamente nel file di testo XML.

Cioè, è necessario utilizzare solo CDATAse si digita manualmente o si crea direttamente a livello di codice il testo XML.

Qualsiasi testo immesso utilizzando un'API del processore DOM o SimpleXML verrà automaticamente eliminato per impedire l'esecuzione di regole di contenuto XML errate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.