PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

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

> Найдено сообщений: 7
lupus Отправлено: 27 Апреля, 2013 - 11:26:10 • Тема: SimpleXML и ответ сервера OZON.ru • Форум: XML и его обработка

Ответов: 0
Просмотров: 2352
Доброго всем времени суток! Мне необходимо организовать поиск товара по каталогу 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).
lupus Отправлено: 27 Апреля, 2013 - 10:56:40 • Тема: Некорректные имена свойств объекта • Форум: Хранение данных, их вывод и обработка

Ответов: 11
Просмотров: 2542
DeepVarvar пишет:
vim, не?

DeepVarvar, спасибо, в репозиториях он нашёлся, установил, буду осваивать.
lupus Отправлено: 26 Апреля, 2013 - 20:49:37 • Тема: Некорректные имена свойств объекта • Форум: Хранение данных, их вывод и обработка

Ответов: 11
Просмотров: 2542
caballero, спасибо.
P.S. Кому нужен NetBeans для Fedora/RFRemix версии 17/18 (в репозиториях его нет), взять его можно здесь (полный список сборок). Устанавливать пакеты необходимо в следующем порядке:
1. netbeans-cvsclient-7.0.1-1.fc17. noarch.rpm
2. netbeans-ide-7.0.1-1.fc17.noarch .rpm
3. netbeans-java-7.0.1-1.fc17.noarc h.rpm
4. netbeans-apisupport-7.0.1-1.fc17 .noarch.rpm
5. netbeans-7.0.1-1.fc17.noarch.rpm
lupus Отправлено: 26 Апреля, 2013 - 19:44:04 • Тема: Некорректные имена свойств объекта • Форум: Хранение данных, их вывод и обработка

Ответов: 11
Просмотров: 2542
caballero, посоветуйте, пожалуйста, специализированный редактор с синтаксическим анализатором, чтобы понимал синтаксис хотя бы PHP и JavaScript и работал бы под Линуксом (64-разрядная версия RFRemix 18 (ремикс дистрибутива Fedora, адаптированный для российских пользователей)).
lupus Отправлено: 26 Апреля, 2013 - 19:33:06 • Тема: Некорректные имена свойств объекта • Форум: Хранение данных, их вывод и обработка

Ответов: 11
Просмотров: 2542
Мелкий, см. мой ответ caballero. Причина была в обрабатываемом JSON и особенностях подсветки синтаксиса редактора KWrite, а не в коде и не в интерпретаторе.
P.S. Применил всё-таки var_dump:

В случае с заведомо правильным объектом $userData (содержащим нужное свойство age_range) получил структуру объекта, в котором таки было свойство min:
PHP:
скопировать код в буфер обмена
  1. object(stdClass)#54 (1) { ["min"]=> int(21) }

При попытке же "натравить" этот же фрагмент кода на объект, полученный в результате парсинга JSON, я получил в ответ NULL, что означает, что такого свойства у объекта нет.
lupus Отправлено: 26 Апреля, 2013 - 19:26:51 • Тема: Некорректные имена свойств объекта • Форум: Хранение данных, их вывод и обработка

Ответов: 11
Просмотров: 2542
caballero, спасибо за ответ! Добавил дополнительную проверку на предмет наличия свойства age_range->min у объекта $userData:
PHP:
скопировать код в буфер обмена
  1. if (property_exists ($userData, 'age_range'))
  2. {
  3.     print (property_exists ($userData->age_range, 'min')) ? $userData->age_range->min : "Нет данных";
  4. }
  5. else
  6. {
  7.    print "Нет данных";
  8. }

Попробовал скормить объект, заведомо содержащий данное свойство и получил требуемое значение. Видимо, в объекте, получившемся в результате обработки полученного JSON, данное свойство отсутствовало. На неверный путь меня натолкнула особенность подсветки синтаксиса PHP редактора KWrite, который, видимо, не отличает min и max как свойства объекта от min и max как функций, поэтому всегда подсвечивает их как функции (скриншот прицепил).
lupus Отправлено: 26 Апреля, 2013 - 18:33:05 • Тема: Некорректные имена свойств объекта • Форум: Хранение данных, их вывод и обработка

Ответов: 11
Просмотров: 2542
Доброго всем времени суток! Суть проблемы такова: при обработке ответа в формате JSON получается объект, часть свойств которого имеют названия, являющиеся встроенными функциями PHP (min и max). При попытке обращения к данным свойствам объекта PHP воспринимает их как функции и, соответственно, я не получаю необходимых данных, например, такой фрагмент:
PHP:
скопировать код в буфер обмена
  1. print $userData->age_range->min;

ничего не выводит, т.к. интерпретатор воспринимает min как функцию нахождения минимального значения, а не как свойство объекта $userData->age_range. Что необходимо сделать, чтобы PHP воспринимал min как свойство объекта, а не как функцию?
ОС: RFRemix 18. Веб-сервер: Apache 2.4.4. Версия PHP: 5.4.14.

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB