2012-03-07 1 views
1

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

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

Я хочу сгенерировать эти XML-файлы с помощью Perl и проанализировать их с помощью C++ (с использованием expat), Java и C#.

Самое главное, что я хочу, чтобы полученные файлы были в некотором смысле удобочитаемыми/модифицируемыми. Кто-нибудь знает какую-либо схему кодирования, которая соответствует этим потребностям? Я использую это для хранения данных для базы данных, поэтому он должен принимать произвольный текст и после разбора возвращать тот же самый текст.

ответ

1

xml уже поддерживает это, вам не нужно ничего делать, и вам, разумеется, не нужно использовать CDATA. просто используйте приличную библиотеку, убедитесь, что вы используете кодировку UTF-8 и добавляете текстовый узел. если что-то «теряет» символы новой строки, то это ошибка. xml уже имеет «кодировку» (экранирование), которая относительно читаема человеком. он также является стандартным, что делает его гораздо более полезным, чем придумывание собственного.

смотри, например https://stackoverflow.com/a/1140802/181772

+0

Просто, чтобы убедиться, что если я взял любую строку, которая может содержаться в столбце SQL_WCHAR некоторой базы данных, кодируйте с помощью одного из стандартных Perl XML библиотеки, такие как XML :: Code, а затем проанализировать его с помощью парсеров стандартной библиотеки expat или C#/Java, я всегда верну исходную строку? – Bwmat

+0

да, точно. если вы этого не сделаете, тогда есть ошибка. вы должны установить кодировку (поэтому документ начинается с ) и следуйте всем правилам - в основном используйте библиотеку для создания документа, а не «вручную», с строками или операциями печати. –

+0

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

0

Вы можете закодировать содержимое, если содержание было HTML, например:

<html>&lt;b&gt;Bold Text&lt;/b&gt;</html> 

против

<html><![CDATA[<b>Bold Text</b>]]></html> 
+0

<, >, и & получить закодированы, но как насчет пробельных/строками? – Bwmat

+0

Не должно быть проблем с пробелами или символами новой строки. Хотя отображаемый HTML, например, сворачивает пробелы или новые строки, они сохраняются в XML. – dave

0

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

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

Другим вариантом, полностью нарушающим ваше «удобочитаемое» требование, является кодирование текста на основе base64, что позволяет кодировать произвольную информацию в XML.

+0

. Контрольные символы, отличные от вкладки возврата каретки новой строки и пробела, вообще не допускаются в XML (внутри CDATA или снаружи). Единственные символы, интерпретация которых изменена CDATA, это '<' и '&' –

+0

. Я сижу исправлен. – Aatch