Есть ли смысл помещать строку, содержащую вводы (char 10 или 13) в раздел xml CDATA? - PullRequest
0 голосов
/ 29 мая 2009

В настоящее время я работаю над старым кодом, который имеет следующую конструкцию.

Document doc = org.w3c.Document
Element root = doc.getDocumentElement();

if ( string contains \n or \r )
then
  root.appendChild(doc.createCDATASection(string))
else
  root.appendChild(doc.createTextNode(string))
endif  

Я не могу придумать, как использовать строку CDATA, если она содержит "\ n" или "\ r". Я полагаю, что использование createTextNode не приведет к обрезке или удалению новых строк в тексте, если строка похожа на «mytext \ n \ n \ n», когда вы устанавливаете ее или извлекаете значение.

Может ли кто-нибудь придумать допустимый / полезный случай, когда вы хотите поместить такую ​​строку в раздел CDATA?

Ответы [ 6 ]

1 голос
/ 29 мая 2009

В XML CDATA сохраняет пробелы, обычный текст - нет.

1 голос
/ 29 мая 2009

Я знаю, это звучит очевидно, но если вы встраиваете простой текстовый файл ascii и хотите сохранить дословное форматирование файла вручную. Это было бы полезным делом.

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

0 голосов
/ 11 октября 2009

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

Первоначальный разработчик, вероятно, путает обработку в DOM текстовых узлов, содержащих пробелы, с обработкой текстовых узлов, содержащих только пробелов. DOM часто нормализуют текстовые узлы только для пробелов, что может быть проблемой в XML, например:

<xsl:value-of select="foo"/>
<xsl:text>    </xsl:text>
<xsl:value-of select="bar"/>

Если DOM нормализует четыре пробела во втором элементе до одного пробела, это меняет функциональность этого преобразования, что однозначно плохо.

Но есть причина, по которой вы не видите XSLT, которая выглядит так:

<xsl:value-of select="foo"/>
<xsl:text><![CDATA[    ]]>/xsl:text>
<xsl:value-of select="bar"/>

И это то, что процессоры XSLT написаны людьми, которые понимают, как работают объекты XML, и которые знают, что в их конкретном случае важно сказать DOM сохранить пробелы в текстовых узлах только для пробелов.

0 голосов
/ 29 мая 2009

Я бы сказал, что это полностью зависит от того, удаляет ли ваш XML-анализ пробелы и управляющие символы. Я вполне уверен, что System.Xml в .NET этого не делают, ни MSXML, ни Xerces, но есть варианты сделать это.

0 голосов
/ 29 мая 2009

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

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

0 голосов
/ 29 мая 2009

Я мог бы быть далеко от этого, но, похоже, я помню, что это хорошая рекомендация помещать код Javascript в теги CDATA. Фактически см. Выбранный ответ для этого вопроса о переполнении стека, поскольку он неплохо справляется с ответом на вопрос: Когда раздел CDATA необходим в теге скрипта?

...