Co oznacza XML?

Często znajduję ten dziwny znacznik CDATA w plikach XML:

<![CDATA[some stuff]]>

Zauważyłem, że ten znacznik CDATA zawsze pojawia się na początku, a potem następuje kilka rzeczy.

Ale czasami jest używany, czasami nie jest. Zakładam, że jest to zaznaczenie, że some stuff jest "danymi", które zostaną wstawione po tym. Ale jakie są dane some stuff? Czy coś, co piszę w znacznikach XML, nie jest jakimś rodzajem danych?

 1065
Author: jpaugh, 2010-05-06

13 answers

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

Kluczowe różnice między CDATA a komentarzami są następujące:

Oznacza to, że biorąc pod uwagę te cztery fragmenty XML z jednego dobrze uformowanego 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>
 994
Author: Sean Vieira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-31 00:58:31

Sekcja CDATA jest " sekcją zawartości elementu, która jest oznaczana dla parsera do interpretacji jako 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 to część 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ć następujący plik jako .xhtml (nie .html) i otwórz go za pomocą Firefoksa (, a nie Internet Explorera ), aby zobaczyć różnicę między komentarzem a sekcją CDATA; komentarz nie pojawi się podczas przeglądania dokumentu w przeglądarce, natomiast 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>

Należy zwrócić uwagę na to, że sekcje CDATA nie mają kodowania, więc nie ma sposobu na umieszczenie w nich ciągu ]]>. Wszelkie dane znakowe zawierające ]]> będą musiały-o ile wiem-być węzłem tekstowym. Podobnie, z punktu widzenia manipulacji DOM nie można utworzyć sekcji CDATA zawierającej ]]>:

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

Ten kod do manipulacji domami będzie albo wyrzuć wyjątek (w Firefoksie), albo uzyskaj źle skonstruowany dokument XML: http://jsfiddle.net/9NNHA/

 346
Author: Richard JP Le Guen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-25 15:36:56

Jeden duży przypadek użycia: Twój xml zawiera program jako dane (np. samouczek strony internetowej dla Javy). W takiej sytuacji Twoje dane zawierają dużą część znaków, które zawierają ' & 'I'

Porównaj:

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

Szczególnie jeśli kopiujesz / wklejasz ten kod z pliku (lub dołączasz go do pre-procesora), dobrze jest mieć tylko znaki, które chcesz w pliku xml, bez mylenia ich z XML tagi / atrybuty. Jak wspomniano @paary, inne typowe zastosowania obejmują osadzanie adresów URL zawierających ampersands. Wreszcie, nawet jeśli dane zawierają tylko kilka znaków specjalnych, ale dane są bardzo długie (powiedzmy tekst rozdziału), miło jest nie musieć en / de-kodowania tych kilku encji podczas edycji pliku xml.

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

 71
Author: not-just-yeti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-28 13:52:44

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>

Więc CDATA oznacza, że zignoruje każdy znak, który mógłby być interpretowany jako znacznik XML, taki jak itd.

 43
Author: Octane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-02 11:42:13

Dane w nim zawarte nie będą przetwarzane jako XML i jako takie nie muszą być poprawnym XML lub mogą zawierać elementy, które mogą wydawać się XML, ale nie są.

 34
Author: fbrereto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 20:23:19

Z Wikipedii:

[w] dokumencie XML lub zewnętrznym przetwarzanym encji, sekcja CDATA jest sekcja zawartości elementu oznaczona do interpretacji przez parser jako tylko dane znakowe, a nie znaczniki.

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

Tak więc: tekst wewnątrz CDATA jest postrzegany przez parser, ale tylko jako znaki, a nie jako węzły XML.

 17
Author: Chdid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 10:53:50

Jako kolejny przykład jego użycia:

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

<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 wewnątrz CDATA.

Uwaga - nie wszystkie znaczniki HTML działają - myślę, że zależy to od czytnika RSS, którego używasz.


I jako wyjaśnienie dlaczego ten przykład używa CData (a nie odpowiedniego pubData i dc: creator tags): służy do wyświetlania strony za pomocą widżetu RSS, dla którego nie mamy rzeczywistej kontroli formatowania.

Pozwala nam to określić wysokość i pozycję dołączonego obrazu, poprawnie sformatować nazwiska autorów i datę itd., bez potrzeby stosowania nowego widżetu. Oznacza to również, że mogę to napisać i nie muszę dodawać ich ręcznie.

 17
Author: LadyCygnus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-23 04:49:35

CDATA oznacza dane znakowe. Możesz użyć tego do ucieczki niektórych znaków, które w przeciwnym razie będą traktowane jako zwykły XML. Dane znajdujące się w tym pliku nie będą przetwarzane. Na przykład, jeśli chcesz przekazać adres URL zawierający &, możesz użyć CDATA, aby to zrobić. W przeciwnym razie pojawi się błąd, ponieważ będzie on przetwarzany jako zwykły XML.

 11
Author: paary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-28 20:39:05

Jest używany do przechowywania danych, które mogą być postrzegane jako xml, ponieważ zawierają określone znaki.

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

 7
Author: Ikke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 04:53:29

Usuwa ciąg znaków, który nie może być przekazany do XML jak zwykle:

Przykład:

łańcuch zawiera "&".

Nie możesz:

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

Dlatego musisz użyć CDATA:

<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>
 7
Author: HoangYell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-25 03:28:39

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

 2
Author: Johan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 20:26:29

Cdata to dane, które możesz chcieć przekazać do parsera xml i nadal nie są interpretowane jako xml.

Powiedzmy na przykład: - masz xml, który zawiera obiekt question / answer . 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. Jak -- czy to poprawny tag dla komentarza xml ? .-- Możesz mieć wymóg, aby przekazać go tak, jak jest bez interpretacji przez parser xml jako innego dziecka element. Tutaj Cdata przychodzi na ratunek. Deklarując jako Cdata, mówisz parserowi, że nie traktuje danych zawiniętych jako xml (choć może tak wyglądać)

 2
Author: randomness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-19 19:12:02

Zauważ, że konstrukcja CDATA jest potrzebna tylko w przypadku umieszczenia tekstu bezpośrednio w pliku tekstowym XML.

Oznacza to, że wystarczy użyć CDATA, jeśli ręcznie wpisujesz lub programowo budujesz tekst XML bezpośrednio.

Każdy tekst wprowadzony za pomocą API procesora DOM lub SimpleXML zostanie automatycznie uwolniony, aby zapobiec uruchomieniu reguł zawartości XML.

Niezależnie od tego, mogą być sytuacje, w których użycie CDATA może zmniejszyć rozmiar tekstu, który w przeciwnym razie byłby wytwarzany ze wszystkimi encjami kodowane, takie jak css w znacznikach style lub javascript w znacznikach script, gdzie wiele konstrukcji językowych używa znaków w HTML / XML, takich jak < i >.

 1
Author: Patanjali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-11 02:07:20