Co oznacza <! [CDATA []]> w XML?

1014

Często znajduję ten dziwny CDATAtag w XMLplikach:

<![CDATA[some stuff]]>

Zauważyłem, że ten CDATAtag zawsze pojawia się na początku, a następnie kilka rzeczy.

Ale czasami jest używany, a czasem nie. Zakładam, że chodzi o zaznaczenie, że będą some stuffto „dane”, które zostaną później wstawione. Ale jakie to dane some stuff? Czy nic, co piszę w tagach XML, nie jest jakimś rodzajem danych?

dontWatchMyProfile
źródło

Odpowiedzi:

951

CDATA oznacza dane znakowe i oznacza, że ​​dane pomiędzy tymi ciągami zawierają dane, które mogą być interpretowane jako znaczniki XML, ale nie powinny.

Najważniejsze różnice między CDATA a komentarzami to:

Oznacza to, biorąc pod uwagę te cztery fragmenty kodu XML z jednego dobrze sformułowanego dokumentu:

<!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
źródło
35
Jak można uniknąć znaku sekwencji CEND?
Thomas Weller,
23
Musisz mieć dwie sekcje CDATA, aby połączyć ]]i >- zobacz tę odpowiedź dla hows i dlaczego.
Sean Vieira,
2
czy musi być nowy znak linii między początkiem CDATA a surowymi danymi?
Ben Sewards,
2
Nie, nie ma @BenSewards
Sean Vieira
5
Więc ten kawałek kodu C-jak nie mogła być łatwo umieścić w sekcji CDATA: if (a[b[c]]>10) { }.
Anders Tornblad
341

Sekcja CDATA to „ sekcja zawartości elementu, która jest oznaczona, aby analizator składni mógł interpretować tylko dane znakowe, a nie znaczniki ”.

Składniowo zachowuje się podobnie do komentarza:

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

... ale nadal jest częścią dokumentu:

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

Spróbuj zapisać poniższe jako .xhtmlplik ( nie .html ) i otwórz go za pomocą FireFox ( nie Internet Explorer ), aby zobaczyć różnicę między komentarzem a sekcją CDATA; komentarz nie pojawi się, gdy spojrzysz na dokument w przeglądarce, a sekcja 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>

W sekcjach CDATA należy zwrócić uwagę na to, że nie mają one kodowania, więc nie ma możliwości włączenia do nich łańcucha ]]>. Wszelkie dane znakowe, które zawierają, ]]>będą musiały - o ile mi wiadomo - być węzłem tekstowym. Podobnie z perspektywy manipulacji DOM nie można utworzyć sekcji CDATA, która zawiera ]]>:

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

Ten kod manipulacji DOM spowoduje zgłoszenie wyjątku (w przeglądarce Firefox) lub spowoduje powstanie źle sformułowanego dokumentu XML: http://jsfiddle.net/9NNHA/

Richard JP Le Guen
źródło
3
Dlaczego więc „ý” nie jest dozwolone w CDATA?
bjan
10
@bjan - Co sprawia, że ​​uważasz, że to nielegalna postać? Wygląda na to, że masz problem z kodowaniem.
Richard JP Le Guen
Otworzyłem dokument w IE, używam również parsera MSXML, który zadeklarował go jako nieprawidłowy znak. Mam xsd, w którym jest zadeklarowany jako „type =” xs: string ””. Czy jest to związane z kodowaniem lub wersją XML?
bjan
CDATA jest analizowany i dozwolony jest tu również prawidłowy zakres znaków, służy on do ucieczki przed blokami tekstu zawierającego znaki, które w innym przypadku zostałyby rozpoznane jako znaczniki
bjan
1
Możemy więc użyć CDATA do przemycenia części HTML do dokumentu XML, aby HTML nie myli struktury dokumentu XML, a następnie użyj XSLT później, aby go wyciągnąć i splunąć w dokument HTML, który jest wysyłany.
Kaz.
69

Jeden duży przypadek użycia: twój xml zawiera program jako dane (np. Samouczek strony internetowej dla Javy). W tej sytuacji twoje dane zawierają dużą część znaków, które zawierają „&” i „<”, ale te znaki nie mają być xml.

Porównać:

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

z

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

Zwłaszcza jeśli kopiujesz / wklejasz ten kod z pliku (lub dołączasz go do preprocesora), dobrze jest mieć po prostu znaki, które chcesz w pliku xml, bez pomylenia ich ze znacznikami / atrybutami XML. Jak wspomniano w @paary, inne popularne zastosowania obejmują umieszczanie adresów URL zawierających znaki ampersand. Wreszcie, nawet jeśli dane zawierają tylko kilka znaków specjalnych, ale dane są bardzo, bardzo długie (powiedzmy tekst rozdziału), miło jest nie musieć en / dekodować tych kilku jednostek podczas edycji pliku xml .

(Podejrzewam, że wszystkie porównania do komentarzy są trochę mylące / nieprzydatne).

nie-tylko-yeti
źródło
41

Kiedyś musiałem użyć CDATA, gdy mój element xml musiał przechowywać kod HTML. Coś jak

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

Zatem CDATA oznacza, że ​​zignoruje każdy znak, który w innym przypadku mógłby być interpretowany jako znacznik XML, taki jak <i> itp.

Oktan
źródło
2
Nie „tag”, ale element w pierwszym zdaniu.
Ludovic Kuty
32

Dane w nich zawarte nie będą analizowane jako XML i jako takie nie muszą być poprawne XML lub mogą zawierać elementy, które mogą wyglądać na XML, ale nimi nie są.

fbrereto
źródło
16

Z Wikipedii:

[W] dokumencie XML lub zewnętrznej analizowanej jednostce sekcja CDATA jest sekcją zawartości elementu, która jest oznaczona do przeanalizowania przez analizator składni wyłącznie danych znakowych, a nie znaczników.

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

Zatem: tekst wewnątrz CDATA jest postrzegany przez analizator składni, ale tylko jako znaki, a nie jako węzły XML.

Chdid
źródło
13

Jako kolejny przykład jego użycia:

Jeśli masz kanał RSS (dokument xml) i chcesz dołączyć podstawowe kodowanie HTML do wyświetlania opisu, możesz użyć CData do jego zakodowania:

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

Czytnik RSS pobiera opis i renderuje HTML w CDATA.

Uwaga - nie wszystkie tagi HTML działają - myślę, że zależy to od używanego czytnika RSS.


I jako wyjaśnienie, dlaczego w tym przykładzie użyto CData (a nie odpowiednich tagów pubData i dc: creator): jest to do wyświetlania witryny za pomocą widgetu RSS, dla którego nie mamy prawdziwej kontroli formatowania.

To pozwala nam określić wysokość i pozycję dołączonego obrazu, poprawnie sformatować nazwiska autora i datę itd., Bez potrzeby posiadania nowego widżetu. Oznacza to również, że mogę to napisać i nie muszę dodawać ich ręcznie.

LadyCygnus
źródło
9

CDATA to skrót od Character Data. Możesz użyć tego do zmiany niektórych znaków, które w przeciwnym razie będą traktowane jako zwykłe XML. Dane w tym pliku nie zostaną przeanalizowane. Na przykład, jeśli chcesz przekazać adres URL, który zawiera &, możesz użyć do tego CDATA. W przeciwnym razie pojawi się błąd, ponieważ zostanie on przeanalizowany jako zwykły plik XML.

paary
źródło
6

Jest używany do przechowywania danych, które inaczej mogłyby być postrzegane jako xml, ponieważ zawiera pewne znaki.

W ten sposób dane wewnątrz będą wyświetlane, ale nie interpretowane.

Ikke
źródło
5

Ucieka ciąg znaków, którego nie można przekazać do XML w zwykły sposób:

Przykład:

Ciąg zawiera w sobie „&”.

Nie możesz:

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

Dlatego musisz użyć CDATA:

<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>
HoangYell
źródło
1

Zwykle używany do osadzania niestandardowych danych, takich jak obrazy lub dane dźwiękowe w dokumencie XML.

Johan
źródło
3
Chociaż możesz umieścić dane binarne zakodowane w tekście w sekcji CDATA, nie musisz tego robić, ponieważ CDATA nie ma nic wspólnego z danymi binarnymi.
Joel Mueller
1

Cdata to dane, które możesz chcieć przekazać do analizatora składni xml i nadal nie będą interpretowane jako xml.

Powiedz na przykład: - Masz plik XML zawierający obiekt pytania / odpowiedzi. Takie otwarte pola mogą zawierać dowolne dane, które nie należą ściśle do podstawowego typu danych lub niestandardowych typów danych zdefiniowanych w xml. Lubię to - czy jest to poprawny tag dla komentarza xml? .-- Może być wymagane przekazanie go takim, jakim jest, bez interpretacji przez analizator składni xml jako innego elementu potomnego. Tutaj Cdata przybywa na ratunek. Deklarując jako Cdata, mówisz parserowi, że nie traktuje danych opakowanych jako xml (choć może to wyglądać jak jeden)

losowość
źródło
0

Zauważ, że CDATAkonstrukcja jest potrzebna tylko wtedy, gdy umieszczasz tekst bezpośrednio w pliku tekstowym XML.

Oznacza to, że musisz używać tylko CDATAwtedy, gdy wpisujesz ręcznie lub programowo budujesz tekst XML bezpośrednio.

Każdy tekst wprowadzony za pomocą interfejsu API procesora DOM lub SimpleXML zostanie automatycznie opatrzony znakami ucieczki, aby zapobiec nieprawidłowemu działaniu reguł treści XML.

Patanjali
źródło