Форматы данных

CDATA в XML: синтаксис, примеры и ограничения

Секция CDATA позволяет записать внутри XML-элемента текст с буквальными < и &. Парсер воспринимает её содержимое как текст, а не как разметку элементов.

Опубликовано

Синтаксис CDATA внутри XML-элемента

Текст элемента — x < 10 & ready. Ограничители относятся к XML-синтаксису и в значение не входят. Секция CDATA не создаёт дочерний элемент, не задаёт кодировку и не превращает содержимое в исполняемый код.

<message><![CDATA[x < 10 & ready]]></message>

CDATA и экранирование могут давать одинаковый текст

Оба элемента содержат строку <b>Hello</b> & ready. В cdata похожие на теги фрагменты b остаются текстом. В escaped парсер преобразует ссылки на сущности в те же символы. Выбирайте удобную для чтения запись XML; приложению обычно нужно итоговое значение.

<samples>
  <cdata><![CDATA[<b>Hello</b> & ready]]></cdata>
  <escaped>&lt;b&gt;Hello&lt;/b&gt; &amp; ready</escaped>
</samples>

Ссылки на сущности внутри CDATA не раскрываются

literal содержит пять символов &amp;, а resolved — один амперсанд. Если сначала экранировать значение, а потом обернуть его в CDATA, итоговый текст изменится. В интерактивном сравнении ниже можно проверить оба случая.

<literal><![CDATA[&amp;]]></literal>
<resolved>&amp;</resolved>

Как записать ]]> без вложенных секций

Здесь две соседние секции. Первая заканчивается после двух буквальных закрывающих скобок, вторая начинается с >. Вместе они дают текст a ]]> b. Другой вариант — обычный экранированный текст: <message>a ]]&gt; b</message>.

Вложенные секции CDATA недопустимы. При создании XML используйте сериализатор и текстовые узлы вместо вставки произвольного пользовательского текста между ограничителями. DOM-метод createCDATASection отклоняет значение, содержащее ]]>.

<message><![CDATA[a ]]]]><![CDATA[> b]]></message>

CDATA и PCDATA, атрибуты и комментарии

Тип атрибута CDATA в DTD — другое использование этого термина. Такое объявление не разрешает секцию <![CDATA[...]]> внутри значения атрибута. Там нужны обычные правила экранирования атрибутов.

ФормаЗначениеЧастая ошибка
Секция CDATAТекст элемента с буквальными символами разметкиОжидать преобразования &amp; в & внутри секции
PCDATA / обычный разбираемый текстСимвольные данные с распознаванием ссылок на сущностиОставлять буквальный & без экранирования
Значение атрибутаЗначение в кавычках внутри открывающего тегаВставлять в него секцию CDATA
XML-комментарийОтдельный синтаксис комментарияИспользовать CDATA для комментирования данных

Что происходит с CDATA при конвертации в JSON?

В режиме Smart конвертер представляет разобранные символьные данные строками JSON. Границы CDATA и исходная запись сущностей при таком отображении не сохраняются. Сравнивайте значения, а не побайтовое восстановление исходного XML.

В примере есть Привет и नमस्ते — обычный Unicode-текст внутри CDATA. Если байты исходного файла декодированы неверно, обёртка CDATA не исправит кодировку.

CDATA не обеспечивает безопасный вывод HTML

Строка <b>Hello</b> остаётся данными во время разбора XML-секции CDATA. Если приложение затем вставит её как HTML, браузер применит правила HTML. Выводите строку как текст либо очищайте HTML по правилам приложения, если действительно нужен HTML.

Синтаксис CDATA относится к XML. Он не является универсальным способом экранирования для обычных HTML-документов. В наших примерах результирующие строки отображаются как текст.

Частые вопросы

Можно ли вложить CDATA в другую секцию CDATA?

Нет. Первая последовательность ]]> закроет текущую секцию. Разбейте текст на соседние секции или передайте его XML-сериализатору как обычный текст.

Можно ли поместить в CDATA любые двоичные данные?

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

Нужна ли CDATA для HTML внутри XML?

Нет. Правильно экранированный текст элемента может содержать ту же строку HTML. CDATA — удобная форма записи, которая не гарантирует безопасность последующего HTML-вывода.

Проверьте пример

Сравните CDATA, экранирование и буквальные сущности

Преобразуйте документ с тремя вариантами записи текста.

<samples><cdata><![CDATA[<b>Привет / नमस्ते</b> & ready]]></cdata><escaped>&lt;b&gt;Привет / नमस्ते&lt;/b&gt; &amp; ready</escaped><literal><![CDATA[&amp;]]></literal></samples>

Ожидаемый результат: cdata и escaped дают одинаковый текст; literal содержит строку из пяти символов &amp;.

Проверьте пример

Объедините текст двух секций CDATA

Символы ]]> распределены между соседними секциями.

<message><![CDATA[a ]]]]><![CDATA[> b]]></message>

Ожидаемый результат: Значение message — a ]]> b. Ограничители CDATA не входят в разобранный текст.

Посмотрите результат парсинга

Проверьте, как CDATA выглядит в JSON

Загрузите сравнительный пример и проверьте получившиеся строки в локальном конвертере XML в JSON.

Открыть XML to JSON Converter →

Документация и стандарты