Просмотр полной версии : Обработка XML-ответов на сайте
Добрый день! Хотелось бы разобрать пример процесса общения с сервером.
Посылаю запрос(GetMovies), получаю xml-ответ. Хочу узнать названия фильмов в ответе. Но в хмл строке это закомменчено: <name><!--[CDATA[Starперцы]]--></name>
Почему так и как с этим справиться? str_replace не помогает))
При общении с сервером использую следующие конструкции (может кому пригодятся):
//отправка запроса
fwrite($fp, $str_query);
$n = fgets($fp,11);
fgets($fp,2);
$s = fgets($fp,$n+1);$xml=$s;
fclose($fp);
//обработка ответа, преобразование в массив
$xml=simplexml_load_string($xml);
function objectsIntoArray($arrObjData, $arrSkipIndices = array())
{
$arrData = array();
// if input is object, convert into array
if (is_object($arrObjData)) {
$arrObjData = get_object_vars($arrObjData);
}
if (is_array($arrObjData)) {
foreach ($arrObjData as $index => $value) {
if (is_object($value) || is_array($value)) {
$value = objectsIntoArray($value, $arrSkipIndices); // recursive call
}
if (in_array($index, $arrSkipIndices)) {
continue;
}
$arrData[$index] = $value;
}
}
return $arrData;
}
//Пример обращения к id
echo $arrXml[Data][Movies][Movie][0]['@attributes'][ID];
Отступы не переносятся в сообщение, извините...
С радостью узнаю более простые варианты)))
Как то странно...
Проверил у себя на одном из объектов, в ответ на GetMovies возвращает
<Name><![CDATA[Название фильма]]></Name>
Проверял через SocketTest. В логах External ответ такой же...
Подскажите пожалуйста, пишу страничку на php для внешнего протокола, да вот столкнулся с непонятной проблемой. Сразу оговорюсь, с php только знакомлюсь, не пинайте.
Подключаюсь к модулю:
//Отправка запроса
$ip = "10.0.1.10";
$port = "9193";
$fp = fsockopen($ip, $port, $en, $es, 7);
if(!$fp)
exit("Connection failed. Error #".$en.": ".$es);
else{
fputs($fp, $str_query);
//echo ("Connection OK<br />");
$xml_response = "";
$xml_response = fgets($fp);
$n = fgets($fp,11);
$s = fgets($fp,$n+1);
echo ("$xml_response");
fclose($fp);
}
ответ ожидается вида
0000006231&<?xml version='1.0' encoding='Windows-1251' standalone='yes'?><XML><Result>Ok</Result><Error></Error><Remark></Remark><Data><Movies><Movie ID='658'><Name><=!=[=C=D=A=T=A=[50 îòòåíêîâ ñåðîãî]=]=></Name><Duration Duration='130'>2ч 10мин</Duration><OtherName><=!=[=C=D=A=T=A=[]=]=></OtherName><SubName><=!=[=C=D=A=T=A=[]=]=></SubName><UpName><=!=[=C=D=A=T=A=[]=]=></UpName><Remark><=!=[=C=D=A=T=A=[]=]=></Remark><Picture><=!=[=C=D=A=T=A=[]=]=></Picture><Properties></Properties><Rental from_date='' to_date='' INN='' KPP='' OGRN=''><SessionCount></SessionCount><PU_NUMBER></PU_NUMBER><FullName><=!=[=C=D=A=T=A=[]=]=></FullName><ShortName><=!=[=C=D=A=T=A=[]=]=></ShortName><Address><=!=[=C=D=A=T=A=[]=]=></Address><Phone></Phone><Remark><=!=[=C=D=A=T=A=[]=]=></Remark></Rental></Movie></Movies></Data></XML>
но отображается
0000006231&Ok2ч 10мин
1ч 40мин
1ч 40мин
...
То бишь все остальные элементы разметки не отображаются.
В чём беда, подскажите пожалуйста
Ну так то все верно.
echo ("$xml_response");
Отдает браузеру xml полученный от шлюза. Браузер его интерпретирует, парсит и показывает вам уже только текст.
Попробуйте так:
echo ("<pre>$xml_response</pre>");
Ну так то все верно.
Отдает браузеру xml полученный от шлюза. Браузер его интерпретирует, парсит и показывает вам уже только текст.
Попробуйте так:
echo ("<pre>$xml_response</pre>");
Не-а. Результат тот же, только шрифт поменялся))
Какой запрос пихаете в $str_query?
SocketTest пробовали тот же запрос сделать? Что он получает?
В браузере - ПКМ - "показать исходный код страницы" что там будет?
Какой запрос пихаете в $str_query?
SocketTest пробовали тот же запрос сделать? Что он получает?
В браузере - ПКМ - "показать исходный код страницы" что там будет?
1. В переменной запрос GetMovies
2. В SocketTest полный вывод запроса
3. В браузере в исходнике также полный вывод.
Это конечно прекрасно, что в исходнике полный вывод. Но начну я работать с массивом и так же ничего не будет выводиться, кроме времени, как мне кажется.
3. В браузере в исходнике также полный вывод.
Воооттт!!!
Т.е. в переменной $xml_response у вас лежит полная XML структура. Но что вы видите на экране это "трудности перевода" и тут уже нужно разбираться с вашим браузером.
Если вы запишите содержимое переменной $xml_response, например, в файл то там все будет на месте.
Соответственно и при работе с переменной у вас все будет на месте.
Воооттт!!!
Т.е. в переменной $xml_response у вас лежит полная XML структура. Но что вы видите на экране это "трудности перевода" и тут уже нужно разбираться с вашим браузером.
Если вы запишите содержимое переменной $xml_response, например, в файл то там все будет на месте.
Соответственно и при работе с переменной у вас все будет на месте.
Аа, понял. Спасибо. А что может быть с браузером, точнее что в нём посмотреть стоит?
Я не знаю какой у вас браузер, какими тегами обрамлен ваш код и поэтому ХЗ чем тут помочь...
Попробовал у себя открыть xml файл (IE и FireFox) в обоих случаях структура отобразилась полностью.
Я не знаю какой у вас браузер, какими тегами обрамлен ваш код и поэтому ХЗ чем тут помочь...
Попробовал у себя открыть xml файл (IE и FireFox) в обоих случаях структура отобразилась полностью.
Ну у меня хром для серфинга и встроенный в IDE Webkit. Оба одинаково отображают.
Мозилла и IE отображают точно так же :-(
Сохраните исходник. Положите сюда.
Сохраните исходник. Положите сюда.
3489
Я имел ввиду немного другое:
После того как скрипт отработает сохраните и приложите исходный код страницы, которая у вас получается в браузере.
Я имел ввиду немного другое:
После того как скрипт отработает сохраните и приложите исходный код страницы, которая у вас получается в браузере.
Сказали "исходник" я и положил исходник :D
3490
Ну я все равно не пойму что вас смущает. Ну не хочет браузер отображать эту XML структуру (точнее пытается ее распарсить и получает то что вы видите на экране). Но вам же это никак не мешает. Все данные от шлюза вы получили, они есть в переменной $xml_response.
Если очень хотите увидеть на экране результат, сделайте так что бы интерпритатор браузера не вмешивался. Например так:
echo ("<textarea cols=120 rows=50>$xml_response</textarea>");
Ну я все равно не пойму что вас смущает. Ну не хочет браузер отображать эту XML структуру (точнее пытается ее распарсить и получает то что вы видите на экране). Но вам же это никак не мешает. Все данные от шлюза вы получили, они есть в переменной $xml_response.
Если очень хотите увидеть на экране результат, сделайте так что бы интерпритатор браузера не вмешивался. Например так:
echo ("<textarea cols=120 rows=50>$xml_response</textarea>");
Да, так вывело на экран полный ответ сервера. Просто смутил меня этот момент. Буду пробовать теперь вывести данные в массив.
Спасибо!
Brambrulet
26.01.2015, 20:34
Браузеру можно говорить что конкретно он получает. Если послать одни и те же данные, но сказать, что это text/plain, text/html, text/xml, и т.д. то на экране получим очень разное. Я с PHP тоже не особо, но на Perl в своё время пописал ... суть та же - CGI.
В общем почитай про заголовок. В частности узнай как задать значение поля Content-Type.
Браузеру можно говорить что конкретно он получает. Если послать одни и те же данные, но сказать, что это text/plain, text/html, text/xml, и т.д. то на экране получим очень разное. Я с PHP тоже не особо, но на Perl в своё время пописал ... суть та же - CGI.
В общем почитай про заголовок. В частности узнай как задать значение поля Content-Type.
Я писал
header('content-type: text/xml'); но в итоге вместо текстового вывода получал ошибку
This page contains the following errors:
error on line 1 at column 1: Document is empty
error on line 1 at column 1: Encoding error
Below is a rendering of the page up to the first error.
Brambrulet
26.01.2015, 21:29
Ну дык продолжай в том же духе. Оно явно теперь просит Content-Encoding.
А может и нет. Может он хочет значение в форме: text/xml;charset=utf-8
Господа, подниму тему. Может кто-то знает или сталкивался, существует ли какое-то ограничение на количество символов (или байт) ответа от сервера? Я знаю, что в настройках модуля есть возможность задать макс.размер ответной xml, но у меня почему-то ответная xml ограничивается 8749 байтами и обрывается. В смысле не обрыв связи, а обрыв текста xml.
После чего это началось. Решил в Премьере к фильмам добавлять постеры, ролики и аннотации, до этого ничего из этого не добавлялось. Через внешний модуль всё нормально загружалось. Но теперь, после добавления аннотаций к фильмам, сайт поломался. Методом тыка выяснилось, что это из-за аннотаций, которые подгружаются вместе с информацией о фильме (GetMovies). Если в расписании нет фильмов с аннотацией, то всё работает как и прежде хорошо.
Забыл уточнить - премьера 3.22R1, внешний протокол 3.05
------------
Короче я не знаю, что за глюк был такой. Но сейчас спокойно загружаются данные 44000+ байт и никакого ограничения не видно.
По предыдущему посту - в аннотации не должно быть переносов строк, скрипт почему-то читает только однострочные хмл.
Тут другой вопрос возник. Как из ответа сервера по запросу GetMovies получить картинку (постер) фильма. В ответе приходит что-то вида
<XML>
<Result>Ok</Result>
<Error></Error>
<Remark></Remark>
<Data>
<Movies>
<Movie ID='123' AgeRestriction='0'>
<Name>
<=!=[=C=D=A=T=A=[SomeMovieName]=]=>
</Name>
<Duration Duration='100'>
1ч 40мин
</Duration>
<Remark>
<=!=[=C=D=A=T=A=[SomeMovieRemark]=]=>
</Remark>
<Picture>
<=!=[=C=D=A=T=A=[SomeMovieImg.jpg]=]=>
</Picture>
<Properties></Properties>
</Movie>
</Movies>
</Data>
</XML>
В теге <Picture> указано просто имя файла, или же его содержимое в частности? Если содержимое, то как его достать? А если просто имя, то как получить сопсно картинку?
--------
Есть мысль сделать симлинк на папку, в которой лежат картинки. Но это костыль и не решает проблему, если эти картинки лежат, к примеру, на хостинге...
Powered by vBulletin® Version 4.2.6 LTS Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot