Що означає <! [CDATA []]> у XML?


1014

Я часто знаходжу цей дивний CDATAтег у XMLфайлах:

<![CDATA[some stuff]]>

Я помітив, що цей CDATAтег завжди виникає на початку, а потім слідує якийсь матеріал.

Але іноді воно використовується, інколи - ні. Я припускаю, що це означає, що some stuffце "дані", які будуть вставлені після цього. Але що це за дані some stuff? Хіба я нічого не пишу в теги XML якісь дані?

Відповіді:


951

CDATA означає « Дані символів», і це означає, що дані між цими рядками містять дані, які можна інтерпретувати як розмітку XML, але не повинні бути.

Ключові відмінності між CDATA та коментарями:

  • Як зазначає Річард , CDATA все ще є частиною документа, тоді як коментар - ні.
  • У CDATA ви не можете включити рядок ]]>( CDEnd), а в коментарі --недійсний .
  • Посилання суб'єкта параметри не розпізнаються всередині коментарів.

Це означає, враховуючи ці чотири фрагменти XML з одного добре сформованого документа:

<!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
Як можна уникнути символу послідовності CEND?
Томас Веллер

23
У вас повинно бути два розділи CDATA, щоб об'єднати ]]і >- див. Цю відповідь на те, як і як.
Шон Віейра

2
чи повинен бути новий символьний рядок між початком CDATA та необробленими даними?
Бен Сьюардс

2
Ні там немає @BenSewards
Шон Віейра

5
Так цей шматок C-подібний код не може бути легко помістити в розділ CDATA: if (a[b[c]]>10) { }.
Андерс Торнблад

341

Розділ CDATA - це " розділ вмісту елементів, який позначений парсером для інтерпретації лише символьних даних, а не розмітки ".

Синтаксично він поводиться аналогічно коментарю:

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

... але це все ще є частиною документа:

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

Спробуйте зберегти таке у .xhtmlфайлі ( не .html ) та відкрийте його за допомогою FireFox ( не Internet Explorer ), щоб побачити різницю між коментарем та розділом CDATA; коментар не з’явиться, якщо ви подивитеся на документ у браузері, тоді як розділ 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>

Що слід зауважити за розділами CDATA, це те, що вони не мають кодування, тому немає можливості включити рядок ]]>до них. Будь-які дані символів, які містять ]]>, повинні бути, наскільки я знаю, текстовим вузлом. Так само, з точки зору маніпуляції з DOM, ви не можете створити розділ CDATA, який включає ]]>:

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

Цей маніпуляційний код DOM або буде викидати виняток (у Firefox), або призведе до погано структурованого XML-документа: http://jsfiddle.net/9NNHA/


3
Тоді чому "ý" не дозволено в CDATA?
bjan

10
@bjan - Що змушує вас вважати, що це незаконний персонаж? Здається, у вас може виникнути проблема з кодуванням.
Річард JP Le Guen

Я відкрив документ в IE, я також використовую аналізатор MSXML, який оголосив його як недійсний символ. У мене є xsd, в якому він оголошений як "type =" xs: string "". Це пов'язано з кодуванням чи версією XML?
bjan

CDATA розбирається і тут допускається лише допустимий діапазон символів, він використовується для виходу з блоків тексту, що містять символи, які в іншому випадку будуть розпізнані як розмітка
bjan

1
Таким чином, ми могли використовувати CDATA для контрабанди деякого HTML у документі XML, щоб HTML не плутати структуру документа XML, а потім використовувати XSLT пізніше, щоб витягнути його та виплеснути у документ, що виводиться HTML.
Каз

69

Один великий випадок використання: ваш xml включає програму як дані (наприклад, навчальний посібник для веб-сторінок для Java). У цій ситуації ваші дані містять великий фрагмент символів, який включає "&" та "<", але ці символи не мають бути xml.

Порівняйте:

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

з

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

Особливо, якщо ви копіюєте / вставляєте цей код з файлу (або включаєте його в попередній процесор), приємно просто мати потрібні символи у вашому XML-файлі, не плутаючи їх з тегами / атрибутами XML. Як зазначалося @paary, до вбудованих URL-адрес, що містять амперсанд, входять інші поширені способи використання. Нарешті, навіть якщо дані містять лише декілька спеціальних символів, але дані дуже довгі (текст глави, скажімо), приємно, щоб не редагувати XML-файл, коли ви редагуєте свій XML-файл. .

(Я підозрюю, що всі порівняння з коментарями начебто вводять в оману / не допомагають.)


41

Колись мені довелося використовувати CDATA, коли мій елемент xml потрібен для зберігання HTML-коду. Щось на зразок

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

Таким чином, CDATA означає, що він буде ігнорувати будь-який символ, який інакше може бути інтерпретований як тег XML, як <і> тощо.


2
Не "тег", а елемент у першому реченні.
Людович Куті

32

Дані, що містяться в ній, не будуть розбиратися як XML, і тому такі не повинні бути дійсними XML або можуть містити елементи, які можуть здаватися XML, але не є.


16

З Вікіпедії:

[У] документі XML або зовнішньому проаналізованому об'єкті, розділ CDATA - це розділ вмісту елементів, який позначений для аналізатора для інтерпретації лише символьних даних, а не розмітки.

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

Таким чином: текст усередині CDATA розглядається парсером, але лише як символи, а не як XML-вузли.


13

В якості іншого прикладу його використання:

Якщо у вас є RSS-канал (XML-документ) і ви хочете включити базове кодування HTML у відображення опису, ви можете використовувати CData для його кодування:

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

RSS Reader містить опис і надає HTML-код в межах CDATA.

Примітка - не всі теги HTML працюють - я думаю, це залежить від RSS-зчитувача, який ви використовуєте.


І як пояснення того, чому цей приклад використовує CData (а не відповідні теги pubData та dc: creator): це для відображення веб-сайту за допомогою віджета RSS, для якого у нас немає реального контролю форматування.

Це дозволяє нам визначити висоту та положення включеного зображення, правильно відформатувати імена автора та дату тощо, без необхідності нового віджета. Це також означає, що я можу це сценарій, і не потрібно їх додавати вручну.


9

CDATA означає Дані символів. Ви можете використовувати це, щоб уникнути деяких символів, які в іншому випадку будуть розглядатися як звичайні XML. Дані всередині цього не будуть проаналізовані. Наприклад, якщо ви хочете передати URL-адресу, яка міститься &в ньому, ви можете використовувати CDATA для цього. В іншому випадку ви отримаєте помилку, оскільки вона буде проаналізована як звичайна XML.


6

Він використовується, щоб містити дані, які в іншому випадку можна розглядати як xml, оскільки вони містять певні символи.

Таким чином дані всередині будуть відображатися, але не інтерпретуватися.


5

Він уникає рядок, який неможливо передати XML як завжди:

Приклад:

Рядок містить "&" в ньому.

Ви не можете:

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

Тому ви повинні використовувати CDATA:

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

1

Зазвичай використовується для вбудовування користувацьких даних, наприклад, зображень або звукових даних у XML-документ.


3
Хоча ви можете помістити текстові бінарні дані в розділ CDATA, вам не доведеться, тому що CDATA не має нічого спільного з бінарним.
Джоель Мюллер

1

Cdata - це дані, які ви можете передати в XML-аналізатор і все ще не інтерпретуватися як xml.

Скажімо, наприклад: - У вас є XML, який містить інкапсулює об'єкт питання / відповіді. Такі відкриті поля можуть мати будь-які дані, які не підпадають суворо під базовий тип даних або визначені спеціальні типи даних xml. Як - Це правильний тег для коментарів xml? . - У вас може виникнути вимога передавати його таким, яким він є, без інтерпретації xml-аналізатора як іншого дочірнього елемента. Тут на допомогу приходить Кдата. Заявивши як Cdata, ви говорите, що аналізатор не розглядає дані, загорнуті як xml (хоча це може виглядати як один)


0

Зауважте, що CDATAконструкція потрібна лише в тому випадку, якщо текст розміщується безпосередньо у текстовому файлі XML.

Тобто, вам потрібно користуватися лише в тому CDATAвипадку, якщо вводити рукою або програмно будувати текст XML безпосередньо.

Будь-який текст, введений за допомогою API процесора DOM або SimpleXML, буде автоматично видалений, щоб уникнути порушення правил щодо вмісту XML.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.