Что означает <! [CDATA []]> в XML?
Я часто нахожу это странным CDATA
отметить в XML
файлы:
<![CDATA[some stuff]]>
Я заметил, что это CDATA
тег всегда идет в начале, а затем сопровождается некоторыми вещами.
Но иногда это используется, иногда это не так. Я предполагаю, что это означает, что some stuff
это "данные", которые будут вставлены после этого. Но что это за данные? some stuff
? Разве что-то, что я пишу в тегах XML, не является чем-то вроде данных?
11 ответов
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>
Раздел 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/
Один большой пример использования: ваш xml включает в себя программу в качестве данных (например, учебник по веб-страницам для Java). В этой ситуации ваши данные включают в себя большой набор символов, которые включают '&' и '<', но эти символы не должны быть XML.
Для сравнения:
<example-code>
while (x < len && !done) {
print( "Still working, 'zzz'." );
++x;
}
</example-code>
с
<example-code><![CDATA[
while (x < len && !done) {
print( "Still working, 'zzzz'." );
++x;
}
]]></example-code>
Особенно, если вы копируете / вставляете этот код из файла (или включаете его в препроцессор), хорошо просто иметь нужные символы в вашем XML-файле, не путая их с тегами / атрибутами XML. Как упоминалось @paary, другие распространенные случаи использования включают в себя встраивание URL-адресов, содержащих амперсанды. Наконец, даже если данные содержат только несколько специальных символов, но данные очень и очень длинные (скажем, текст главы), было бы хорошо, если бы вы не редактировали эти несколько сущностей при редактировании своего XML-файла.,
(Я подозреваю, что все сравнения с комментариями вводят в заблуждение / бесполезно.)
Мне когда-то приходилось использовать CDATA, когда мой тег xml был необходим для хранения HTML-кода. Что-то вроде
<codearea>
<![CDATA[
<div> <p> my para </p> </div>
]]>
</codearea>
Таким образом, CDATA означает, что он будет игнорировать любой символ, который в противном случае может быть интерпретирован как тег XML, такой как <и> и т. Д.
Содержащиеся в нем данные не будут анализироваться как XML, и поэтому не обязательно должны быть действительными XML или могут содержать элементы, которые могут выглядеть как XML, но не являются таковыми.
Как еще один пример его использования...
Если у вас есть 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, для которого у нас нет реального элемента управления форматированием.
Это позволяет нам указать высоту и положение включенного изображения, правильно отформатировать имена и дату автора и т. Д. Без необходимости создания нового виджета. Это также означает, что я могу написать это и не добавлять их вручную.
Из Википедии:
[В] XML-документе или внешнем разобранном объекте раздел CDATA - это раздел содержимого элемента, помеченный для синтаксического анализатора как интерпретируемый как только символьные данные, а не разметка.
Таким образом: текст внутри CDATA воспринимается синтаксическим анализатором, но только как символы, а не как узлы XML.
Он экранирует строку, которую нельзя передать в XML как обычно:
Пример:
Строка содержит "&" в нем.
Ты не можешь:
<FL val="Company Name">Dolce & Gabbana</FL>
Поэтому вы должны использовать CDATA:
<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>
CDATA расшифровывается как Character Data. Вы можете использовать это для экранирования некоторых символов, которые в противном случае будут рассматриваться как обычный XML. Данные внутри этого не будут проанализированы. Например, если вы хотите передать URL, который содержит &
в нем вы можете использовать CDATA, чтобы сделать это. В противном случае вы получите ошибку, поскольку она будет проанализирована как обычный XML.
Он используется для хранения данных, которые в противном случае могут рассматриваться как xml, поскольку содержат определенные символы.
Таким образом, данные внутри будут отображаться, но не интерпретироваться.
Cdata - это данные, которые вы, возможно, захотите передать синтаксическому анализатору xml, но они все еще не интерпретируются как xml.
Скажем, например:- У вас есть XML, который содержит объект вопроса / ответа. Такие открытые поля могут иметь любые данные, которые строго не подпадают под базовый тип данных или определенные пользователем типы данных xml. Нравится -Это правильный тег для комментария xml?.-- У вас может быть требование передать его в том виде, в каком оно есть, без интерпретации анализатором xml как другого дочернего элемента. Здесь Cdata приходит на помощь. Объявляя как Cdata, вы говорите парсеру не обрабатывать данные, обернутые как xml (хотя они могут выглядеть как один)
Обычно используется для встраивания пользовательских данных, таких как изображения или звуковые данные, в документ XML.
Обратите внимание, что CDATA
конструкция требуется только при размещении текста непосредственно в текстовом XML-файле.
То есть вам нужно только использовать CDATA
при ручном вводе или программном построении текста XML напрямую.
Любой текст, введенный с использованием API процессора DOM или SimpleXML, будет автоматически экранирован, чтобы предотвратить нарушение правил содержимого XML.
Несмотря на это, могут быть случаи, когда использование CDATA
может уменьшить размер текста, который в противном случае был бы создан со всеми закодированными объектами, например, для css в script
теги или javascript в script
теги, в которых во многих языковых конструкциях используются символы HTML|XML, например <
а также >
.