Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: SimpleXML и ответ сервера OZON.ru
Форумы портала PHP.SU » » XML и его обработка » SimpleXML и ответ сервера OZON.ru

Страниц (1): [1]
 

1. lupus - 27 Апреля, 2013 - 11:26:10 - перейти к сообщению
Доброго всем времени суток! Мне необходимо организовать поиск товара по каталогу OZON.ru. Для этого:
1. Сформировал и отправил запрос на сервер OZON.ru методом GET (параметр q не пуст):
PHP:
скопировать код в буфер обмена
  1. $query = $_GET ["q"];
  2. //Получаем строку для поиска методом GET
  3. $url = 'http://ozon.ru/webservice/webservice.asmx/SearchWebService?searchText='.$query.'&searchContext=';
  4. //URL запроса

2. Получил и обработал ответ в формате XML:
PHP:
скопировать код в буфер обмена
  1. $xml = file_get_contents ($url);
  2. //Получаем XML
  3. $xmlObj = simplexml_load_string ($xml);
  4. //Парсим XML и преобразуем его в объект SimpleXMLElement
  5. print var_dump ($xmlObj);
  6. //Выводим структуру $xmlObj

При этом, хотя переменная $xml не пуста, получаю пустой объект:
PHP:
скопировать код в буфер обмена
  1. object(SimpleXMLElement)#1 (0) { }

Пробовал очистить XML от HTML-тегов и символов CR, сохранить его как файл и потом открыть и распарсить:
PHP:
скопировать код в буфер обмена
  1. $tmpDir = $_SERVER ['DOCUMENT_ROOT'].'/files/tmp/';
  2. //Каталог для временных файлов на сервере
  3. $xml = str_replace ("\r", '', $xml);
  4. //Убираем символы CR (0x0D)
  5. $xml = html_entity_decode ($xml);
  6. //Преобразуем все HTML-сущности в соответствующие символы
  7. $xml = str_ireplace ('<br>', "\n", $xml);
  8. //Заменяем теги <br> на символы LF (0x0A)
  9. $xml = str_ireplace ('<b>', '', $xml);
  10. $xml = str_ireplace ('</b>', '', $xml);
  11. //Удаляем теги <b></b>
  12. $xml = str_ireplace ('<li>', '- ', $xml);
  13. $xml = str_ireplace ('</li>', '', $xml);
  14. //Удаляем теги <li></li>
  15. $xml = str_ireplace ('<i>', '', $xml);
  16. $xml = str_ireplace ('</i>', '', $xml);
  17. //Удаляем теги <i></i>
  18. $xml = str_ireplace ('<p>', '', $xml);
  19. $xml = str_ireplace ('</p>', '', $xml);
  20. //Удаляем теги <p></p>
  21. $tmpFile = tempnam ($tmpDir, '');
  22. //Создаём временный файл с уникальным именем
  23. file_put_contents ($tmpFile, $xml);
  24. //Сохраняем XML в файл
  25. $xmlObj = simplexml_load_file ($tmpFile);
  26. //Открываем файл и парсим содержащийся в нём XML
  27. print var_dump ($xmlObj);
  28. //Выводим структуру $xmlObj

При этом объект по-прежнему пуст, хотя файл не пуст и содержит XML, который был в переменной $xml.
Пример из документации при этом парсится нормально - такой код:
PHP:
скопировать код в буфер обмена
  1. $xmlObj = simplexml_load_file ('/var/www/html/files/tmp/example.xml');
  2. //Открываем файл и парсим содержащийся в нём XML
  3. print var_dump ($xmlObj);
  4. //Выводим структуру $xmlObj

выводит мне такую структуру переменной $xmlObj, что говорит о том, что дело не в PHP-коде и не в правах доступа, а в самом обрабатываемом XML:
PHP:
скопировать код в буфер обмена
  1. object(SimpleXMLElement)#1 (1) {
  2.  ["movie"]=>
  3.   object(SimpleXMLElement)#2 (5) {
  4.    ["title"]=>
  5.     string(38) "PHP: Появление Парсера"
  6.     ["characters"]=>
  7.     object(SimpleXMLElement)#3 (1) {
  8.      ["character"]=>
  9.       array(2) {
  10.         [0]=>
  11.         object(SimpleXMLElement)#5 (2) {
  12.          ["name"]=>
  13.           string(9) "Ms. Coder"
  14.           ["actor"]=>
  15.           string(14) "Onlivia Actora"
  16.         }
  17.         [1]=>
  18.         object(SimpleXMLElement)#6 (2) {
  19.          ["name"]=>
  20.           string(9) "Mr. Coder"
  21.           ["actor"]=>
  22.           string(9) "El ActУr"
  23.         }
  24.       }
  25.     }
  26.     ["plot"]=>
  27.     string(301) "
  28.   Таким образом, это язык. Это все равно язык программирования. Или
  29.   это скриптовый язык? Все раскрывается в этом документальном фильме,
  30.   похожем на фильм ужасов.
  31.  "
  32.     ["great-lines"]=>
  33.     object(SimpleXMLElement)#4 (1) {
  34.      ["line"]=>
  35.       string(54) "PHP решает все мои проблемы в web"
  36.     }
  37.     ["rating"]=>
  38.     array(2) {
  39.       [0]=>
  40.       string(1) "7"
  41.       [1]=>
  42.       string(1) "5"
  43.     }
  44.   }
  45. }

Где может быть ошибка (имеется в виду сам обрабатываемый XML)? XML до чистки от HTML-тегов (raw.xml) и после неё (xml_vquV4U.xml) в заархивированном виде прилагаю. Второй файл переименовал (добавил расширение .xml), чтобы его можно было открыть не только под UNIX-подобными ОС, но и под виндой.
ОС: RFRemix 18. Веб-сервер: Apache 2.4.4. Версия PHP: 5.4.14. Права на каталог /var/www/html/files/tmp: хозяин: apache, группа: apache, rwxr-xr-x (755).

 

Powered by ExBB FM 1.0 RC1