Что означает <! [CDATA []]> в XML?

Я часто нахожу этот странный тег CDATA в файлах XML:

<![CDATA[some stuff]]>

Я заметил, что этот тег CDATA всегда приходит в начале, а затем сопровождается некоторыми вещами.

Но иногда он используется, иногда это не так. Я предполагаю, что это означает, что some stuff - это "данные", которые будут вставлены после этого. Но какие данные some stuff? Разве я ничего не пишу в тегах XML какие-то данные?

Ответы

Ответ 1

CDATA означает Персональные данные, и это означает, что данные между этими строками включают данные, которые могут быть интерпретированы как разметка XML, но не должны быть.

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

Это означает, что эти три фрагмента 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>

Ответ 2

Раздел 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, заключается в том, что они не имеют кодировки, поэтому нет возможности включить в них строку ]]>. Любые символьные данные, содержащие ]]>, должны, насколько мне известно, быть текстом node. Аналогично, с точки зрения DOM-манипуляции вы не можете создать раздел CDATA, который включает ]]>:

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

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

Ответ 3

Один большой случай использования: ваш 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 файла.

(Я подозреваю, что все сравнения с комментариями являются заведомо ложными/бесполезными.)

Ответ 4

Мне когда-то пришлось использовать CDATA, когда мой XML-тег должен был хранить HTML-код. Что-то вроде

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

Таким образом, CDATA означает, что он игнорирует любой символ, который в противном случае можно было бы интерпретировать как XML-тэг типа < и > и т.д.

Ответ 5

Данные, содержащиеся в нем, не будут анализироваться как XML и, следовательно, не должны быть действительными XML или могут содержать элементы, которые могут казаться XML, но не являются.

Ответ 6

Из Википедии:

[В] документе XML или внешнем анализируемом объекте, раздел CDATA является раздел содержимого элемента, который помечен для интерпретатора для интерпретации как только символьные данные, а не разметка.

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

Таким образом: текст внутри CDATA рассматривается синтаксическим анализатором, но только как символы не как узлы XML.

Ответ 7

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

Ответ 8

В качестве другого примера использования...

Если у вас есть 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, для которого у нас нет реального управления форматированием.

Это позволяет нам указать высоту и положение включенного изображения, правильно отформатировать имена и дату автора и т.д., без необходимости в новом виджете. Это также означает, что я могу использовать script и не добавлять их вручную.

Ответ 9

Он содержал данные, которые иначе можно было бы рассматривать как xml, поскольку они содержат определенные символы.

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

Ответ 10

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

Ответ 11

Cdata - это данные, которые вы, возможно, захотите передать в XML-парсер и все еще не интерпретируете как xml.

Скажите, например: - У вас есть xml, который инкапсулирует объект question/answer. Такие открытые поля могут иметь любые данные, которые строго не подпадают под базовый тип данных или определенные пользователем типы данных. Например - это правильный тег для комментария xml?.--  У вас может быть требование передать его, как оно есть, без интерпретации синтаксического анализатора xml как другого дочернего элемента. Здесь Cdata приходит вам на помощь. Объявляя в качестве Cdata, что вы говорите, что анализатор не обрабатывает данные, обернутые как xml (хотя это может выглядеть как один)