CDATA
CDATA (/ˈsi.deɪ.tə/) — сокращение от «character data» (в переводе с англ. — «символьные данные»). Используется для разных, но связанных между собой целей в языках разметки SGML и XML. CDATA показывает, что определённая часть документа представляет собой символьные данные, в отличие от несимвольных или символьных, но особым образом структурированных, данных.
CDATA в XML
В XML документах фрагмент, помещённый внутрь CDATA, — это часть содержания элемента, которая помечена для парсера как содержащая только символьные данные, а не разметку. CDATA — это просто альтернативный синтаксис для отображения символьных данных, нет никакой смысловой разницы между символьными данными, которые объявлены как CDATA и символьными данными, которые объявлены в обычном синтаксисе и где «<
» и «>
» будут представлены как «<
» и «>
», соответственно.
Синтаксис и интерпретация
Раздел CDATA начинается со следующей последовательности символов:
<![CDATA[
и заканчивается с первым появлением последовательности:
]]>
Все символы, заключённые между этими двумя последовательностями, интерпретируются как символы, а не как разметка или ссылки на объект. Например, в этой строке:
<sender>John Smith</sender>
открывающий и закрывающий теги «sender» будут интерпретированы как разметка. Однако, если записать её вот так:
<![CDATA[<sender>John Smith</sender>]]>
то этот код будет интерпретирован так же, как если бы было записано:
<sender>John Smith</sender>
Таким образом, теги sender будут восприниматься так же, как «John Smith», то есть как текст.
Аналогично, если в содержимом элемента появляется цифровая последовательность ð
, это будет интерпретировано как простой символ Юникода 00F0. Но если эта последовательность появится в разделе CDATA, она будет разделена на 6 символов: амперсанд, знак октоторпа, цифру 2, цифру 4, цифру 0 и точку с запятой.
Использование CDATA
Новички в использовании XML часто неверно представляют назначение раздела CDATA как «защиту» от обработки данных внутри этого раздела. Некоторые API для работы с XML документами предоставляют независимый доступ к разделу CDATA, но эти возможности существуют поверх и вне обычных требований к системе обработки XML и не меняют смысл этих данных. Символьные данные — это символьные данные, независимо от того, записаны они в раздел CDATA или же с помощью обычной разметки.
Раздел CDATA полезен, когда надо написать XML код как текстовые данные внутри XML документа. Например, если надо набрать книгу про XML на XSL с примерами использования XML приложений, то встречающиеся примеры будут заключены в CDATA. Однако, CDATA не может содержать строку «]]>» и, следовательно, невозможно создавать вложенные разделы CDATA. Если текст содержит «]]>», то можно его отобразить, используя, например, несколько разделов CDATA, оканчивая один из них перед символом «>». Пример:
<![CDATA[]]]]><![CDATA[>]]>
Поэтому для того чтобы закодировать ]]>
в разделе CDATA, заменяют все вхождения этого набора символов на следующее:
]]]]><![CDATA[>
CDATA в DTD
Значения атрибутов типа CDATA
В DTD-файлах и в SGML и в XML атрибуту может быть назначен тип CDATA — произвольные символьные данные. Внутри атрибута типа CDATA разрешены указатели на символ и ссылки на сущность, они будут обрабатываться при чтении документа.
Например, если XML DTD содержит
<!ATTLIST foo a CDATA #IMPLIED>
это значит, что элементы, названные foo, имеют необязательный атрибут «a» типа CDATA. В XML документе, который соответствует этому DTD, может появиться такой элемент:
<foo a="1 & 2 are < 3 ">
и XML-парсер интерпретирует атрибут «a» как символьные данные «1 & 2 are < 3».
Сущности типа CDATA
SGML и XML DTD могут также включать объявления сущностей, в которых маркер CDATA используется, чтобы указать, что сущность представляет собой символьные данные. Символьные данные могут появиться в самом описании или же могут быть доступны как внешний ресурс по ссылке URI. Так или иначе в этой сущности разрешены указатели на символ и ссылки на сущность, которые будут обрабатываться при чтении документа.
Содержание элемента типа CDATA
SGML DTD может объявить содержание элемента типа CDATA. Внутри элемента типа CDATA не обрабатывается никакая разметка. Можно провести аналогию с разделом CDATA в XML, но в данном случае нет никакой специальной разметки, тип CDATA действует сразу на всё содержимое элемента.