Как хранить текстовые данные содержащие теги?

eugef

Новичок
Как хранить текстовые данные содержащие теги?

У меня такая ситуация - я в xml файле передаю текст введенный пользователем.Текст может содержать html теги, а также быть просто числами! Текст я передаю так:
PHP:
<value>Здесь текст</value>
Однако просто запихнуть текст нельзя - мешает наличие тегов!

1. Возникла идея хранить текст в значении аттрибута:
PHP:
<value text="Здесь текст" />
и как-то заменять двойные кавычки в тексте и возвращать их обратно. Однако нигде при передаче большого текста не видел чтоб так делали - значит есть причина? Объясните!

2. Следующий вариант - заменять "плохие" символы на их мнемоники или коды, но тогда непонятно как поступать с мнемониками, которые тоже будут в исходном тексте - ведь обратная замена поменяет и их на "плохие" символы!
PHP:
Было < &#60;
Стало < <
3. Использование секции CDATA:
PHP:
<value><![CDATA[Здесь текст]]></value>
Однако опять, в тексте может встретиться последовательность ]]> или даже ]]></value> , что приведет к ошибке!

4. И последний вариант - это кодировать исходный текст по base64, как вложения в письмах:
PHP:
<value>AB123CD==</value>
Тогда "плохие" символы мы явно не встретим, но теряем возможность просто редактировать xml файл, к тому же неизвестно когда нужно декодировать а когда нет - вариант кодировать ВСЕ значения неприемлем.

Подскажите, какой вариант используете Вы!!!
 

mani13

Новичок
Like an idea:
php > $str = '&gt;&lt;&amp;<>';
php > echo htmlentities($str);
&amp;gt;&amp;lt;&amp;amp;&lt;&gt;
php > echo html_entity_decode(htmlentities($str));
&gt;&lt;&amp;<>
 

dimgel

Новичок
А я добавляю текст через DOM ($elem->appendChild($doc->createTextNode("anything"))), и читаю через DOM ($elem->firstChild->nodeValue), и горя не знаю. DOM сам всё это дерьмо с кодированием разгребает (да ещё и в UTF-8 ;) ).
 

eugef

Новичок
mani13
Хороший вариант - надо будет попробывать! Только вот не совсем понятно как это работает! Как получается вот это:
PHP:
из:                 &gt;&lt;&amp;&lt;&gt;
с помощью:  html_entity_decode(htmlentities($str));
получили:     &gt;&lt;&<>
olpa
Большое спасибо за ссылочки, пригодились!

dimgel
DOM - это конечно хорошо, но из-за большого размера xml приходится парсить с помощью SAX - а он это все не разгребает :-(
 

dimgel

Новичок
Хм.... Стоп. Сам я SAXом не пользовался, но по идее он должен это разгребать. В смысле, должен прочитать именно текстовый нод, если этот текстовый нод был корректно записан, и декодировать его. На то он и парсер. (Не удивлюсь, если выяснится, что DOM его использует для чтения входного потока.) Или я не прав?
 

eugef

Новичок
dimgel , ты прав!
Я записываю в XML следующую строку:
PHP:
> это &gt;
в файле я получаю:
PHP:
&gt; это & amp;gt;
И соответсвенно, когда читаю строку из парсера, то получаю
PHP:
> это &gt;
Что совпадает с исходной строкой!
Это работает.

Однако остается вопрос - правилен ли такой подход?
Какой из предложенных варантов лучше?
 

dimgel

Новичок
Ещё как правилен. Я ж говорю, что DOM - это просто интерфейс работы с деревом документа, а читает он документ из потока с помощью SAX или чего-то аналогичного.
 

eugef

Новичок
dimgel
Ещё как правилен
Если бы это был единственно правильный вариант, тогда зачем секция CDATA? К тому же в инете полно статей о вреде экранирования символов в текстовых нодах XML.
Значит есть какие-то подводные камни?
 
Сверху