Действительно ли разделы CDATA не нужны?

Этот вопрос вызван довольно воинственным отказом разработчика Майкла Риса включить синтаксический анализ разделов CDATA в FOR XML PATH, поскольку "Семантическая разница в хранимых вами данных отсутствует."

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

Что действительно меня раздражает, так это то, что, когда разработчики обращаются к Интернету за советом о том, как отображать сегменты CDATA с использованием FOR XML PATH, респонденты постоянно предлагают им вместо этого использовать FOR XML EXPLICIT, метод рендеринга XML, который Рис назвал "запросом из ада".

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

Так каким же быть? Разделы CDATA действительно пережитки прошлого? Или Рысу следует вытащить палец и разрешить анализ CDATA в FOR XML PATH? И пока мы на этом, тем временем, есть ли какие-нибудь хаки для того, чтобы FOR XML PATH возвращал разделы CDATA?


person One Monkey    schedule 01.12.2010    source источник


Ответы (4)


Разделы CDATA полезны, если вас не волнует семантика данных в них (т. е. вам не нужно их анализировать — это просто последовательность символов), и вы не хотите экранировать какой-либо XML внутри их.

Определение согласно w3:

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

Из википедии:

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

Разделы CDATA полезны для написания кода XML в виде текстовых данных в документе XML. Например, если кто-то хочет набрать книгу с помощью XSL, объясняющего использование XML-приложения, XML-разметка, которая появится в самой книге, будет записана в исходном файле в разделе CDATA. Однако раздел CDATA не может содержать строку ]]›, поэтому раздел CDATA не может содержать вложенные разделы CDATA. Предпочтительный подход к использованию разделов CDATA для кодирования текста, содержащего триаду ]]›, заключается в использовании нескольких разделов CDATA путем разделения каждого вхождения триады непосредственно перед символом ›. Например, чтобы закодировать ]]› нужно было бы написать:

person Oded    schedule 01.12.2010
comment
Это кажется правильным... мне во всяком случае. - person One Monkey; 01.12.2010
comment
@One Monkey - я бы добавил, что в большинстве случаев Майкл Рис прав. Разделы CDATA обычно используются неправильно. Если вам нужно запросить его, его не должно быть в CDATA. - person Oded; 01.12.2010
comment
Это подлинный вопрос, я рад пойти с тем, что лучше. Мне искренне любопытно узнать, что люди думают или что они могут придумать. - person One Monkey; 01.12.2010
comment
@One Monkey - я не сомневаюсь в вопросе или твоих намерениях. Мой ответ был дан добросовестно... - person Oded; 01.12.2010

Разделы CDATA не нужны. Они не «пережиток прошлого», потому что всегда были ненужными.

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

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

FOR XML PATH не требует, чтобы человек сидел и писал материал. Это средство создания допустимого XML из результатов SQL-запроса. (Тоже дело не в парсинге разделов CDATA, а в их производстве - другое дело).

И вы действительно не можете жаловаться на то, что FOR XML EXPLICIT является альтернативой, когда вам нужен действительно точный контроль - причина, по которой FOR XML EXPLICIT иногда так неприятна, заключается именно в том, что она дает вам действительно хороший контроль. Действительно, подумайте, добавили ли они сначала поддержку разделов CDATA, а затем добавили поддержку всех других настроек и параметров конфигурации, которые казались столь же важными для кого-то еще. Сколько времени должно пройти, прежде чем FOR XML EXPLICIT станет автоматическим выбором из-за того, что он проще, чем FOR XML PATH‽

Есть четыре случая, когда CDATA полезен:

  1. Вы сидите за клавиатурой и печатаете это в себе.
  2. Вы имеете дело со смешиванием разных технологий с разными стандартами, разработанными в разное время и которые будут интерпретироваться разными парсерами по-разному (например, javascript, встроенный в XHTML - хотя здесь это не обязательно на 100%, иначе это кошмар).
  3. Вы пытаетесь проанализировать XML чем-то, что не понимает XML.
  4. Вы пытаетесь использовать что-то, построенное на синтаксическом анализаторе, который разрешает низкоуровневый доступ, который различает разделы CDATA и другие символьные данные, и использует этот низкоуровневый доступ ненадлежащим образом.

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

Случай 1 здесь не применяется, это не код, созданный человеком. Случай 2 может применяться здесь, если вы делаете что-то действительно сумасшедшее. Откровенно говоря, отсутствие разделов CDATA здесь вас меньше всего беспокоит; переключитесь на создание более простого XML в запросе и преобразование его в другом месте. Здесь может быть применим случай 3, но несправедливо жаловаться специалистам по SQL, если это так, когда вы должны жаловаться на сломанный синтаксический анализатор XML, который не обрабатывает &lt;example&gt; так же, как <![CDATA[<example>]]>. Здесь можно применить случай 4, но опять же жалуйтесь тому, кто написал код с ошибками, а не специалистам по SQL.

person Jon Hanna    schedule 01.12.2010
comment
Интересная точка зрения, и я понимаю, откуда вы исходите. Чтобы дать некоторый контекст, я получил запрос от нашей команды разработчиков переднего плана на переработку некоторых элементов заказного клиентского API, который представляет часть нашей информации в виде XML-схемы. Некоторые данные представляют собой тип, который обычный дизайнер типов AJAX/HTML/CSS/ECMAScript традиционно запихивает в CDATA. Я готов сказать, что это невозможно, но я просто хотел знать, что не был неразумным, говоря это. - person One Monkey; 01.12.2010
comment
Это невозможно (вы можете использовать EXPLICIT), но это также не обязательно, так как это будет выглядеть так же, как инструменты, которые программисты типа AJAX использовали бы для синтаксического анализа (XHR), даже если это было бы менее приятно, если бы им пришлось так писать в своих текстовых редакторах. С другой стороны, если вы довольны тем, что стандарт XML сделал вещи удобными для вас в каком-то смысле, то почему вы должны жаловаться на то, что кто-то другой воспользовался стандартом XML, который сделал их удобными? - person Jon Hanna; 01.12.2010
comment
Хорошо поразмыслив над этим, я пришел к выводу, что, хотя в теории все это совершенно логично, реальность ставит под сомнение работу. По сути, SQL, который я пишу, содержит много узлов, которые подходят для FOR XML PATH, есть только пара спорных. SQL должен быть легко читаем другим и легко модифицироваться, он обеспечивает крошечную, но важную часть функциональности нашего веб-приложения. Затраты времени на поддержку запросов FOR XML EXPLICIT на нем не оправданы. Но вы не можете запретить конечному пользователю писать угловые скобки «мне нравится» в свободном текстовом поле, что может вызвать проблемы. - person One Monkey; 02.12.2010
comment
Почему это может вызвать проблемы? Если он будет помещен в поле базы данных, то запрос так или иначе ускользнет от него (то есть либо разделы CDATA, либо &lt; и т. д. - если это не так, то это было бы недостатком). - person Jon Hanna; 02.12.2010
comment
Я так полагаю. Проблема здоровой паранойи в том, что иногда она заставляет вас нервничать нелогичным образом. Я знаю, что вы правы, но я не могу не задаться вопросом... так что я думаю, что мы нашли истинную цель CDATA, одеяло безопасности чрезмерно озабоченного разработчика. - person One Monkey; 02.12.2010
comment
Всегда стоит искать проблемы до того, как они возникнут. Однако в этом случае стоит отметить, что разделы CDATA просто не существуют на определенном уровне абстракции. Теперь, если что-то, читающее XML, которое предназначено для того, чтобы привести нас к этому уровню, не будет их анализировать - это является проблемой, - но если что-то, производящее XML, не делает этого, это не имеет значения на уровне абстракции, о которой мы должны беспокоиться. - person Jon Hanna; 02.12.2010

Интересно посмотреть, как кто-то может с таким прихотливым подходом просто выкинуть очень ценный кусок Стандарта. Не все используют XML для нескольких сотен символов HTML или списка элементов для раскрывающегося списка.

Некоторые из нас на самом деле используют XML для обмена данными, очень сложными данными, такими как CCD, CDA CDR, все это стандартные форматы документов в области здравоохранения, и они становятся все более и более популярными с ObamaCare. Часть структуры этих документов содержит вложения, такие как изображения DiCOM, PDF-файлы и другие двоичные данные, которые не должны считываться синтаксическим анализатором по причине существования определения CDATA.

Почему я должен оплачивать накладные расходы синтаксического анализатора, читающего 3-мегабайтное изображение DiCom, встроенное в документ CCD? Почему я должен быть вынужден отделять документ, если он пришел с исходными данными и является частью стандарта XML. И я хочу иметь возможность находить и восстанавливать документ и его содержимое с помощью XML.

Это сбивает меня с толку, почему вы все поддерживаете анализ данных, которые не должны анализироваться движком. Если движок видит CDATA, игнорирует его, это очень просто. И непрекращающийся аргумент, что некоторым это не нужно, неуместен. Это часть стандарта, и стандарт следует поддерживать. Если они хотят добавить «Функция», как она была названа, поддержите поведение по умолчанию с помощью опции.

Пожалуйста, прекратите синтаксический анализ CDATA и игнорируйте его.

person Ron A Wilson    schedule 22.02.2013

Вы абсолютно правы, CDATA необходимы во многих сценариях, они являются частью стандарта XML и должны поддерживаться каждым инструментом/методом манипулирования XML. Но дело в том, что MS обычно это не волнует.. вы знаете, подход типа "640 КБ должно быть достаточно для всех".

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

person Pavel Urbančík    schedule 01.12.2010
comment
Они, безусловно, не должны поддерживаться каждым инструментом/методом манипулирования XML, когда такие инструменты производят, а не анализируют. Это все равно что сказать, что нам нельзя разрешать писать программы на C#, которые не используют отражение, поскольку это предусмотрено стандартом, или писать программное обеспечение для Интернета, которое не осуществляет широковещательную рассылку, поскольку это соответствует стандарту TCP/IP. Синтаксический анализатор должен обрабатывать CDATA, производитель волен делать это или нет по своему усмотрению. Действительно, тот факт, что синтаксический анализатор должен обрабатывать как CDATA, так и другое символьное содержимое, является обещанием, данным стандартом XML, что означает, что производитель свободен в этом отношении. - person Jon Hanna; 01.12.2010