PDA

Просмотр полной версии : Обработка XML-ответов на сайте



Octo
11.12.2013, 16:25
Добрый день! Хотелось бы разобрать пример процесса общения с сервером.
Посылаю запрос(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];

Отступы не переносятся в сообщение, извините...
С радостью узнаю более простые варианты)))

sibgaba
13.12.2013, 15:53
Как то странно...
Проверил у себя на одном из объектов, в ответ на GetMovies возвращает

<Name><![CDATA[Название фильма]]></Name>

Проверял через SocketTest. В логах External ответ такой же...

Igoryok
26.01.2015, 03:38
Подскажите пожалуйста, пишу страничку на 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мин
...

То бишь все остальные элементы разметки не отображаются.
В чём беда, подскажите пожалуйста

sibgaba
26.01.2015, 09:35
Ну так то все верно.


echo ("$xml_response");
Отдает браузеру xml полученный от шлюза. Браузер его интерпретирует, парсит и показывает вам уже только текст.

Попробуйте так:
echo ("<pre>$xml_response</pre>");

Igoryok
26.01.2015, 10:20
Ну так то все верно.


Отдает браузеру xml полученный от шлюза. Браузер его интерпретирует, парсит и показывает вам уже только текст.

Попробуйте так:
echo ("<pre>$xml_response</pre>");
Не-а. Результат тот же, только шрифт поменялся))

sibgaba
26.01.2015, 10:23
Какой запрос пихаете в $str_query?

SocketTest пробовали тот же запрос сделать? Что он получает?

В браузере - ПКМ - "показать исходный код страницы" что там будет?

Igoryok
26.01.2015, 12:52
Какой запрос пихаете в $str_query?

SocketTest пробовали тот же запрос сделать? Что он получает?

В браузере - ПКМ - "показать исходный код страницы" что там будет?
1. В переменной запрос GetMovies
2. В SocketTest полный вывод запроса
3. В браузере в исходнике также полный вывод.

Это конечно прекрасно, что в исходнике полный вывод. Но начну я работать с массивом и так же ничего не будет выводиться, кроме времени, как мне кажется.

sibgaba
26.01.2015, 13:18
3. В браузере в исходнике также полный вывод.
Воооттт!!!

Т.е. в переменной $xml_response у вас лежит полная XML структура. Но что вы видите на экране это "трудности перевода" и тут уже нужно разбираться с вашим браузером.

Если вы запишите содержимое переменной $xml_response, например, в файл то там все будет на месте.

Соответственно и при работе с переменной у вас все будет на месте.

Igoryok
26.01.2015, 13:20
Воооттт!!!

Т.е. в переменной $xml_response у вас лежит полная XML структура. Но что вы видите на экране это "трудности перевода" и тут уже нужно разбираться с вашим браузером.

Если вы запишите содержимое переменной $xml_response, например, в файл то там все будет на месте.

Соответственно и при работе с переменной у вас все будет на месте.

Аа, понял. Спасибо. А что может быть с браузером, точнее что в нём посмотреть стоит?

sibgaba
26.01.2015, 13:24
Я не знаю какой у вас браузер, какими тегами обрамлен ваш код и поэтому ХЗ чем тут помочь...

Попробовал у себя открыть xml файл (IE и FireFox) в обоих случаях структура отобразилась полностью.

Igoryok
26.01.2015, 13:26
Я не знаю какой у вас браузер, какими тегами обрамлен ваш код и поэтому ХЗ чем тут помочь...

Попробовал у себя открыть xml файл (IE и FireFox) в обоих случаях структура отобразилась полностью.
Ну у меня хром для серфинга и встроенный в IDE Webkit. Оба одинаково отображают.

Мозилла и IE отображают точно так же :-(

sibgaba
26.01.2015, 14:04
Сохраните исходник. Положите сюда.

Igoryok
26.01.2015, 14:13
Сохраните исходник. Положите сюда.
3489

sibgaba
26.01.2015, 14:15
Я имел ввиду немного другое:

После того как скрипт отработает сохраните и приложите исходный код страницы, которая у вас получается в браузере.

Igoryok
26.01.2015, 14:19
Я имел ввиду немного другое:

После того как скрипт отработает сохраните и приложите исходный код страницы, которая у вас получается в браузере.
Сказали "исходник" я и положил исходник :D

3490

sibgaba
26.01.2015, 14:44
Ну я все равно не пойму что вас смущает. Ну не хочет браузер отображать эту XML структуру (точнее пытается ее распарсить и получает то что вы видите на экране). Но вам же это никак не мешает. Все данные от шлюза вы получили, они есть в переменной $xml_response.

Если очень хотите увидеть на экране результат, сделайте так что бы интерпритатор браузера не вмешивался. Например так:

echo ("<textarea cols=120 rows=50>$xml_response</textarea>");

Igoryok
26.01.2015, 14:50
Ну я все равно не пойму что вас смущает. Ну не хочет браузер отображать эту 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.

Igoryok
26.01.2015, 20:56
Браузеру можно говорить что конкретно он получает. Если послать одни и те же данные, но сказать, что это 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

Igoryok
15.03.2016, 16:31
Господа, подниму тему. Может кто-то знает или сталкивался, существует ли какое-то ограничение на количество символов (или байт) ответа от сервера? Я знаю, что в настройках модуля есть возможность задать макс.размер ответной xml, но у меня почему-то ответная xml ограничивается 8749 байтами и обрывается. В смысле не обрыв связи, а обрыв текста xml.

После чего это началось. Решил в Премьере к фильмам добавлять постеры, ролики и аннотации, до этого ничего из этого не добавлялось. Через внешний модуль всё нормально загружалось. Но теперь, после добавления аннотаций к фильмам, сайт поломался. Методом тыка выяснилось, что это из-за аннотаций, которые подгружаются вместе с информацией о фильме (GetMovies). Если в расписании нет фильмов с аннотацией, то всё работает как и прежде хорошо.

Забыл уточнить - премьера 3.22R1, внешний протокол 3.05

------------

Короче я не знаю, что за глюк был такой. Но сейчас спокойно загружаются данные 44000+ байт и никакого ограничения не видно.

Igoryok
23.05.2016, 14:33
По предыдущему посту - в аннотации не должно быть переносов строк, скрипт почему-то читает только однострочные хмл.

Тут другой вопрос возник. Как из ответа сервера по запросу 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> указано просто имя файла, или же его содержимое в частности? Если содержимое, то как его достать? А если просто имя, то как получить сопсно картинку?

--------
Есть мысль сделать симлинк на папку, в которой лежат картинки. Но это костыль и не решает проблему, если эти картинки лежат, к примеру, на хостинге...