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

863

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

<![CDATA[some stuff]]>

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

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

Теги:
cdata

11 ответов

820
Лучший ответ

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>
  • 27
    Как можно избежать символа последовательности CEND?
  • 18
    У вас должно быть два раздела CDATA для объединения ]] и > - посмотрите этот ответ, чтобы узнать, как и почему.
Показать ещё 8 комментариев
309

Раздел 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/

  • 2
    Тогда почему «ý» не разрешено в CDATA?
  • 9
    @bjan - Что заставляет тебя думать, что это нелегальный персонаж? Похоже, у вас могут быть проблемы с кодировкой.
Показать ещё 6 комментариев
58

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

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

34

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

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

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

  • 2
    Не «тег», а элемент в первом предложении.
27

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

10

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

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

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

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

7

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

6

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

Если у вас есть 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 и не добавлять их вручную.

3

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

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

0

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

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

0

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

  • 3
    Хотя вы можете поместить двоичные данные в кодированном виде в раздел CDATA, вам это не нужно, потому что CDATA не имеет ничего общего с двоичными данными.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню