В чем причина того, что CDATA существует?

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

Интересно, почему он существует в первую очередь? Это не то, что XML не мог обойтись без него, все, что вы можете поместить в раздел CDATA, можно выразить как "родной" (с помощью XML-экранирования).

Я ценю, что CDATA потенциально делает результирующий документ немного меньшим, но пусть сталкивается с этим - XML ​​все равно. Например, небольшие XML-документы можно легко получить с помощью сжатия.

Для меня CDATA нарушает чистое разделение разметки и данных, так как у вас могут быть данные, которые выглядят как разметка для невооруженного глаза, что я считаю плохой. (Это может быть даже одна из тех вещей, которая побуждает людей неадекватно применять обработку строк или регулярное выражение для XML.)

Итак: Какая веская причина в использовании CDATA?

Ответ 1

CDATA разделы предназначены только для удобства авторов, а не для программ. Их единственное использование - дать людям возможность легко включать, например, Пример кода SVG на странице XHTML без необходимости тщательной замены каждого < на &lt; и т.д.

Это для меня предполагаемое использование. Чтобы сделать результирующий документ на несколько байтов меньше, потому что вы можете использовать < вместо &lt;.

Также, снова взяв образец сверху (SVG-код в xhtml), мне легко проверить исходный код файла XHTML и просто скопировать-вставить код SVG без повторной замены &lt; с <.

Ответ 2

PCDATA - проанализированные символьные данные, которые означают, что введенные данные будут проанализированы синтаксическим анализатором.

CDATA - данные, введенные между элементами CDATA, не будут анализироваться синтаксическим анализатором. То есть текст внутри секции CDATA будет игнорироваться синтаксическим анализатором. в результате злоумышленник может отправить уничтожение данных в приложение с помощью этих элементов CDATA.

Раздел CDATA начинается с <![CDATA[ и заканчивается на ]]>.

Единственная строка, которая не может встречаться в CDATA, - ]]>.

Единственная причина, почему мы используем CDATA: текст, такой как код Javascript, содержит много < и символов. Чтобы избежать ошибок, код script может быть определен как CDATA, поскольку только с помощью < будет генерироваться ошибка, поскольку синтаксический анализатор интерпретирует его как начало нового элемента. Аналогично & можно интерпретировать как начало символьной сущности парсером.

Ответ 3

Для меня CDATA - это еще одно слово для лени. Когда я начал с XML, я использовал его, но теперь я всегда конвертирую данные.

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

Создать оболочку XML
Преобразование данных в XML
Поместите данные внутри обертки
Отправка XML на приемник
Разделить XML на XML + данные в XML
Преобразование данных в XML в данные

В то время как использование CDATA приведет к не требующим дополнительных шагов преобразования.

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

Я нашел еще один пример хорошего способа использования CDATA, о котором я должен был подумать. Это случай, когда вам нужно вставлять код в XML файл, код не должен быть преобразован или он не будет работать и/или будет легко читаемым.

Ответ 4

Я считаю, что CDATA предназначался для обеспечения сырых двоичных данных: пока он не содержит "]] > " то все идет в секции CDATA. Это отличает его от обычного XML и ускоряет синтаксический анализ (и отрицает необходимость полного кодирования текста, что дает второе повышение производительности). На самом деле оказалось довольно проблематичным то, что люди не избегают заключительной последовательности, а несколько ранних парсеров разломаны, поэтому большинство теперь просто используют текстовую кодировку для двоичных данных, что делает раздел CDATA несколько бессмысленным, да.

EDIT: обратите внимание, что этот ответ на самом деле неверен, поскольку Tomalak идентифицирует в комментариях. Я не удалял его, потому что знаю, что есть другие люди, которые считают, что в CDATA допустимо использование двоичного файла, и это может прояснить это небольшое недоразумение.

Ответ 5

Я не знаю, насколько это полезно, но я тоже это сделаю:

Одна из проблем заключается в том, что существует несколько отдельных лагерей разработчиков XML, где некоторые представления XML представляют собой представление данных, а некоторые видят его в более документе.. (Красота XML заключается в том, что она хорошо работает для обоих.)

Те, кто рассматривает XML как представление данных - где XML часто создается и потребляется инструментами, а люди участвуют только в поиске и устранении неполадок, - мало ценят в разделе CDATA, потому что он не делает разница в их инструментах, тогда как те, кто использует XML для более ориентированных на документ целей, могут найти разделы CDATA гораздо более полезными.

Ответ 6

MXML демонстрирует отличное использование тегов CDATA. Одна из вещей, которые мне нравятся в MXML, - это действительный XML, то есть я могу делать полезные вещи, например, создавать программные виджеты Flash из другого XML файла с использованием преобразования и проверять MXML на схему.

Знаки CDATA полезны в MXML, потому что они определяют блок ActionScript script в файле MXML, что позволяет мне комбинировать язык сценариев типа ECMA (s > и < и тому подобное) и действительный XML в одном файле.

EDIT:

Я полагаю, что другой вариант объединения MXML и ActionScript состоял бы в том, чтобы объединить их в том, как вы комбинируете HTML и Javascript, а также для того, чтобы обернуть script в тег комментария XML внутри блока script, и выбор вместо этого использование CDATA было сделано разработчиками компилятора MXML. Я полагаю, что рассуждение, вероятно, имеет больше общего с редактированием, так как редактор MXML проверяет ваш код на схему, чтобы проверить синтаксис и предоставить контекстную справку, а также проанализировать ваш код ActionScript для синтаксиса и контекстной справки. Использование CDATA в редакторе позволяет ему выполнять оба действия и различать комментарии XML и блоки script.

Ответ 7

Если у вас есть сомнения, проверьте спецификацию:

2.7 Разделы CDATA

[Определение: разделы CDATA могут возникать в любом случае, когда могут встречаться символьные данные; они используются для удаления блоков текста, содержащих символы, которые в противном случае были бы распознаны как разметка.

Ответ 8

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

Мне часто приходится работать с устаревшими системами, у которых есть выходы HTML, которые часто не очень хорошо сформированы XHTML, я могу прикрепить схему, которая гарантирует правильность структурирования XML, но имеет тег, который просто содержит раздел CDATA для размещения потенциально плохой HTML внутри CDATA.

Это не обычное использование, но оно определенно использует его, когда вы не хотите, чтобы другие люди не могли программировать, чтобы сломать вашу систему.