Что означает <! [CDATA []]> в XML? - PullRequest
924 голосов
/ 07 мая 2010

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

<![CDATA[some stuff]]>

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

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

Ответы [ 12 ]

878 голосов
/ 07 мая 2010

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

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

  • Как указывает Ричард , CDATA по-прежнему является частью документа, а комментарий - нет.
  • В CDATA нельзя включить строку ]]> (CDEnd), а в комментарии -- недопустимо .
  • Параметр Entity ссылки не распознаются внутри комментариев.

Это означает, что эти три фрагмента 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>
325 голосов
/ 07 мая 2010

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

64 голосов
/ 28 мая 2014

Один большой пример использования: ваш xml включает в себя программу в качестве данных (например, учебник по веб-страницам для Java).В этой ситуации ваши данные включают в себя большой набор символов, которые включают '&' и '<', но эти символы не должны быть xml. </p>

Сравните:

<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-файла..

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

38 голосов
/ 14 мая 2015

Мне когда-то приходилось использовать CDATA, когда мой элемент xml требовал хранения HTML-кода. Что-то вроде

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

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

29 голосов
/ 07 мая 2010

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

12 голосов
/ 15 января 2015

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

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

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

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

11 голосов
/ 23 сентября 2014

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

Если у вас есть 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-файлов извлекает описание и отображает HTML-код в CDATA.

Примечание - не все HTML-теги работают - я думаю, что это зависит от используемого читателя RSS.


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

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

8 голосов
/ 10 мая 2012

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

5 голосов
/ 07 мая 2010

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

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

2 голосов
/ 25 марта 2019

Экранируется строкой, которую невозможно передать в XML как обычно:

Пример:

Строка содержит "&" в ней.

Вы не можете:

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

Следовательно, вы должны использовать CDATA:

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