По какой причине CDATA вообще существует?


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

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

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

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

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

8 11

8 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Теги CDATA полезны в MXML, потому что они определяют блок сценария ActionScript в файле MXML, позволяя мне объединить язык сценариев типа ECMA (С > и

Редактировать:

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

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

2.7 разделы CDATA

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

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

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

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