Странный формат выдачи xml
При разработке небольшого проекта появилась такая проблема: в БД хранится текст, форматированный html-тегами, вроде такого:
Первая строка <br/> Вторая строка С помощью Ajax'а на сервер посылается запрос на эту строку. Сценарий php на сервере получает запрос и вытаскивает из БД нужную строку, возвращая её js-файлу в виде xml. Выглядит php-скрипт примерно так: $post = // вытащенная из БД строка header("Content-Type: text/xml"); echo "<?xml version='1.0' encoding='utf-8'?>"; echo "<!DOCTYPE result SYSTEM 'post.dtd'>"; ?> <!-- Возвращаю ответ в формате XML --> <result> <post><![CDATA[<?php echo $post; ?>]]></post> </result> js-скрипт строку получает, всё хорошо, всё html-форматирование сохранено. Но, проблема вот в чём. При разборе полученного xml непонятно кем (я думаю, браузером) все спец. символы (<, >, ', ", ...) заменяются на их коды (<, >, ...), т.е. выводится в итоге не форматированный текст, а текст с тегами. При этом сервер возвращает именно сами тэги (посмотрел в FireBug'e): Код:
Ответ POST: Код:
<result> |
Цитата:
|
Цитата:
<result> <post> <![CDATA[ ]]> </post> </result> Но ведь оно и понятно, т.к. запрос на строку серверу передаётся в формате POST, т.е. в данном случае php-скрипт ничего из БД не вытаскивает. UPD. Подправил xml, что бы он просто выводил тэг: <result> <post><![CDATA[<?php echo "123<br/>321"; ?>]]></post> </result> После чего обратился к php-скрипту напрямую. Ответ xml (FireBug): <result> <post>123<br/>321</post> </result> Снимок FireBug (на всякий случай): ![]() И всё равно не понятно, кто меняет символы. |
skelos,
Вот и не понятно, толи ты канаплю куришь, толи она тебя. При чем тут FireBug? Не умеешь делать пост запросы? |
Цитата:
|
Прости вчера уставший был.
Сервер ничего не меняет это видно даже в первом твоем посте. Ты сам это написал: Цитата:
<form method="post" action="script.php"></form> странно что ты этого не знаешь. В третьих ты не знаешь что такое http://ru.wikipedia.org/wiki/CDATA В этом твоя проблема. Прочитай и поймешь. |
Большое спасибо за помощь. Про отправку через method='post' знал, конечно, просто не понял сразу, что ты об этом.
Почитал поподробнее про CDATA, и, как я понял, что бы обрабатывались html-теги, нужно к xml подключать xslt-преобразования. Написал такое: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="result"> <xsl:apply-templates select="post" /> </xsl:template> <xsl:template match="post"> <xsl:value-of select="post" disable-output-escaping="yes" /> </xsl:template> </xsl:stylesheet> Подключил: Код:
echo "<?xml-stylesheet type='text/xsl' href='post.xsl'?>"; <xsl:template match="post"> <b> <xsl:value-of select="post" disable-output-escaping="yes" /> </b> </xsl:template> то жирным шрифтом ничего не выделяется. Может, xsl сформирован неправильно? |
Неужели никто не сталкивался с такой проблемой? По идее то она вообще банальная - сохранить переводы строки, которые пользователь делал в textarea, и точно так же с этими же переводами строки вывести на экран. Неужели никто так не делал?
|
почему xml, а не json?
|
Всё, вроде как решил проблему. По-своему, правда, но тем не менее работает.
Короче, вся проблема была, как в итоге оказалось, в этой строке: var new_node = document.createTextNode(post); Все теги отлично передавались, но createTextNode все теги и спец. символы превращал в их коды. Решил это тем, что просто стал в post убирать все <br/>, а на их место вставлять createElement('<br/>'); Работает, конечно, не так быстро, как хотелось бы, но работает. Хотя, если кто знает альтернативу createTextNode, но что бы не парсились теги и спец. символы, буду очень благодарен услышать. 2Gozar Не JSON, потому что буду передавать довольно большие куски форматированного текста. Для этого XML подходит лучше. |
Цитата:
JSON короче, чем XML, гораздо короче. |
А ещё можно свой формат забацать... Хотя это уже извращение :)
Но иногда бывает полезно) |
Часовой пояс GMT +3, время: 20:19. |