В чем причина того, что CDATA вообще существует? - PullRequest
11 голосов
/ 11 ноября 2009

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

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

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

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

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

Ответы [ 8 ]

11 голосов
/ 11 ноября 2009

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

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

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

5 голосов
/ 13 ноября 2009

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

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

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

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

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

4 голосов
/ 11 ноября 2009

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

РЕДАКТИРОВАТЬ: обратите внимание, что этот ответ на самом деле является неправильным, как указывает Томалак в комментариях. Я не удалил его, потому что знаю, что есть другие люди, которые думают, что необработанный двоичный файл допустим в CDATA, и это может устранить это небольшое недоразумение.

3 голосов
/ 11 ноября 2009

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

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

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

3 голосов
/ 11 ноября 2009

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

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

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

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

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

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

2 голосов
/ 11 ноября 2009

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

2,7 Разделы CDATA

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

2 голосов
/ 11 ноября 2009

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

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

РЕДАКТИРОВАТЬ:

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

1 голос
/ 11 ноября 2009

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

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

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

...