Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.09.2011, 23:21
Новичок на форуме
Отправить личное сообщение для skelos Посмотреть профиль Найти все сообщения от skelos
 
Регистрация: 10.09.2011
Сообщений: 8

Странный формат выдачи 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 непонятно кем (я думаю, браузером) все спец. символы (<, >, ', ", ...) заменяются на их коды (&lt;, &gt;, ...), т.е. выводится в итоге не форматированный текст, а текст с тегами.
При этом сервер возвращает именно сами тэги (посмотрел в FireBug'e):
Код:
Ответ POST:
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE result SYSTEM 'post.dtd'>
<!-- Возвращаю ответ в формате XML -->
<result>
    <post><![CDATA[Строка 1<br/>Строка 2]]></post>
</result>
Но в том же FireBug'е показывается такой XML-ответ:
Код:
<result>
<post>Строка 1&lt;br/&gt;Строка 2</post>
</result>
Поэтому никак не могу понять, где происходит эта ненужная подмена и кем - сервером или браузером. Помогите, пожалуйста, разобраться.
Ответить с цитированием
  #2 (permalink)  
Старый 10.09.2011, 23:35
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от skelos Посмотреть сообщение
где происходит эта ненужная подмена
Вызови скрипт без аjax и увидишь. хттп двоеточие два слеша и т.д. ...
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #3 (permalink)  
Старый 10.09.2011, 23:40
Новичок на форуме
Отправить личное сообщение для skelos Посмотреть профиль Найти все сообщения от skelos
 
Регистрация: 10.09.2011
Сообщений: 8

Сообщение от Gozar Посмотреть сообщение
Вызови скрипт без аjax и увидишь. хттп двоеточие два слеша и т.д. ...
Если так, то вообще пусто (выдача Chrome):
<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&lt;br/&gt;321</post>
</result>


Снимок FireBug (на всякий случай):

И всё равно не понятно, кто меняет символы.

Последний раз редактировалось skelos, 10.09.2011 в 23:51.
Ответить с цитированием
  #4 (permalink)  
Старый 11.09.2011, 00:37
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

skelos,
Вот и не понятно, толи ты канаплю куришь, толи она тебя. При чем тут FireBug? Не умеешь делать пост запросы?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #5 (permalink)  
Старый 11.09.2011, 00:39
Новичок на форуме
Отправить личное сообщение для skelos Посмотреть профиль Найти все сообщения от skelos
 
Регистрация: 10.09.2011
Сообщений: 8

Сообщение от Gozar Посмотреть сообщение
skelos,
Вот и не понятно, толи ты канаплю куришь, толи она тебя. При чем тут FireBug? Не умеешь делать пост запросы?
Напрямую? Если честно, то нет.
Ответить с цитированием
  #6 (permalink)  
Старый 11.09.2011, 08:59
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Прости вчера уставший был.
Сервер ничего не меняет это видно даже в первом твоем посте. Ты сам это написал:
Цитата:
<post><![CDATA[Строка 1<br/>Строка 2]]></post>
Второе, пост запрос посылать можно так:
<form method="post" action="script.php"></form>

странно что ты этого не знаешь.

В третьих ты не знаешь что такое http://ru.wikipedia.org/wiki/CDATA
В этом твоя проблема. Прочитай и поймешь.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #7 (permalink)  
Старый 11.09.2011, 14:30
Новичок на форуме
Отправить личное сообщение для skelos Посмотреть профиль Найти все сообщения от skelos
 
Регистрация: 10.09.2011
Сообщений: 8

Большое спасибо за помощь. Про отправку через 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 сформирован неправильно?

Последний раз редактировалось skelos, 11.09.2011 в 14:39.
Ответить с цитированием
  #8 (permalink)  
Старый 11.09.2011, 22:33
Новичок на форуме
Отправить личное сообщение для skelos Посмотреть профиль Найти все сообщения от skelos
 
Регистрация: 10.09.2011
Сообщений: 8

Неужели никто не сталкивался с такой проблемой? По идее то она вообще банальная - сохранить переводы строки, которые пользователь делал в textarea, и точно так же с этими же переводами строки вывести на экран. Неужели никто так не делал?
Ответить с цитированием
  #9 (permalink)  
Старый 12.09.2011, 00:21
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

почему xml, а не json?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #10 (permalink)  
Старый 12.09.2011, 00:52
Новичок на форуме
Отправить личное сообщение для skelos Посмотреть профиль Найти все сообщения от skelos
 
Регистрация: 10.09.2011
Сообщений: 8

Всё, вроде как решил проблему. По-своему, правда, но тем не менее работает.
Короче, вся проблема была, как в итоге оказалось, в этой строке:
var new_node = document.createTextNode(post);

Все теги отлично передавались, но createTextNode все теги и спец. символы превращал в их коды.
Решил это тем, что просто стал в post убирать все <br/>, а на их место вставлять createElement('<br/>');
Работает, конечно, не так быстро, как хотелось бы, но работает.

Хотя, если кто знает альтернативу createTextNode, но что бы не парсились теги и спец. символы, буду очень благодарен услышать.

2Gozar
Не JSON, потому что буду передавать довольно большие куски форматированного текста. Для этого XML подходит лучше.

Последний раз редактировалось skelos, 12.09.2011 в 00:58.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jquery распарсить xml выдрать html и вставить kukrinikson Javascript под браузер 0 30.05.2011 17:15
Работа с XML Armen AJAX и COMET 7 16.03.2011 13:59
Помогите с парсингом XML Verhal Общие вопросы Javascript 2 12.06.2010 22:25
Как удалить из памяти весь XML документ? EisBerg Events/DOM/Window 1 03.04.2010 14:45
Не получается загрузить xml из php Alekson jQuery 2 08.07.2009 09:33