Я часто встречаю этот странный тег CDATA
в файлах XML
:
<![CDATA[some stuff]]>
Я заметил, что этот тег CDATA
всегда идет в начале, а затем за ним следуют некоторые вещи.
Но иногда он используется, иногда нет. Я предполагаю, что он обозначает, что некоторые вещи
- это "данные", которые будут вставлены после этого. Но что это за данные - some stuff
? Разве все, что я пишу в XML-тегах, не является какими-то данными?
CDATA означает Character Data и означает, что данные между этими строками включают данные, которые могут быть интерпретированы как XML-разметка, но не должны.
Ключевыми различиями между 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 (not интернет 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-документ:
Один большой вариант использования: 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>
Особенно, если вы копировать/вставить этот код из файла (или в том числе, в пре-процессор), это's хороший, чтобы просто есть символы, которые вы хотите в вашем XML-файле, ж/о путая их с XML-теги/атрибуты. Как @paary уже упоминалось, другие общие области применения включают, когда вы'вновь встраивания URL-адреса, содержащие амперсанд. Наконец, даже если данные только содержит несколько специальных символов, но данные очень и очень долго (текст главы, скажем), это's хороший, чтобы не иметь, чтобы быть En/де-кодирования тех немногих лиц, как вы редактировать XML-файл.
(Я подозреваю, что все сравнения с комментариями вроде сообщают/бесполезный.)
Мне однажды пришлось использовать разделы CDATA, когда мой XML-элемент, необходимый для хранения HTML-код. Что-то вроде
<codearea>
<![CDATA[
<div> <p> my para </p> </div>
]]>
</codearea>
Так CDATA также означает, что он будет игнорировать любые символы, которые могли бы быть истолкованы как XML-тег < и > и т. д.
Из Википедии:
[в] XML-документ или внешней анализируемой сущности, раздел CDATA является В раздел элемент контента, который помечен для парсера как только символьные данные, а не разметки.
Таким образом: текст в CDATA-это видно по анализатору, но только как символы а не как 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-ридер тянет в описании и визуализации HTML в разделы CDATA.
Примечание - не все HTML-теги работают - я думаю, это зависит от читателя RSS, который вы используете.
И как объяснение того, почему этот пример использует тип CDATA (и не соответствующие pubData и DC:теги создатель): это для отображения сайта с помощью виджета RSS для которого у нас нет реального контроля форматирование.
Это позволяет нам определить высоту и положение включены изображения, формат автора, названия и даты правильно, и так далее, без необходимости для нового виджета. Это также означает, что я могу скрипт это и не нужно добавлять их вручную.
CDATA также стенды для символьных данных. Вы можете использовать это, чтобы защитить некоторые символы, которые в противном случае будет рассматриваться как обычный XML-файл. Внутри эти данные не будут обрабатываться.
Например, если вы хотите передать URL-адрес, который содержит &
в нем, вы можете использовать разделы CDATA, чтобы сделать это. В противном случае вы получите сообщение об ошибке, как это будет обрабатываться как обычные XML-файле.
Он используется для содержания данных, которые в противном случае могли бы рассматриваться как xml, поскольку содержат определенные символы.
Таким образом, данные внутри будут отображаться, но не интерпретироваться.
Он убегает строка, которая не может быть передана в XML, как обычно:
Пример:
Эта строка содержит "&ампер;" в нем.
Вы не можете:
<FL val="Company Name">Dolce & Gabbana</FL>
Поэтому, вы должны использовать разделы CDATA:
<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>
В CDATA-это данные, которые вы хотите передать в XML-парсер, и по-прежнему не интерпретировать как XML.
Сказать, например :- есть XML, который инкапсулирует объект вопроса/ответа . Такие открытые поля могут иметь любые данные, которые не вполне подпадают под основной тип данных или XML пользовательские типы данных. Как ... это правильный тег для XML-комментарии <!Комментарий--> ? .-- У вас может быть требование, чтобы передать его, как это без интерпретации синтаксического анализа XML как другой дочерний элемент. Здесь CDATA также приходит к вам на помощь . Объявив как CDATA вы говорите парсер Дон'т обрабатывать данные, завернутый в XML (хотя это может выглядеть как один )