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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: xPath сошёл с ума

 PHP.SU

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


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

> Без описания
Bio man
Отправлено: 08 Октября, 2014 - 20:33:27
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




такая ситуация.
имеется структура
Цитата:
div.months
-- div.perform
-- div.perform
-- итд
div.months
-- div.perform
-- div.perform
-- итд

нужно получить первые 3 элемента div.perform, пишу запрос
CODE (htmlphp):
скопировать код в буфер обмена
  1. //div[@class="perform"][position() > 0 and position() < 4]

НО! этот запрос почему то возвращает по 3 совпадения из каждого div.months!

Как исправить?
(Добавление)
Но что ещё более интересно, так это то что xPath на сервере и на локалке работают по разному.
один и тот же xPath запрос на локалке возвращает правильный результат, а на серваке результат описанный выше.
(Добавление)
источник один и тот же
 
 Top
teddy
Отправлено: 08 Октября, 2014 - 20:46:34
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. //div[@class="perform"][position() <= 3]

Попробуй
 
 Top
Bio man
Отправлено: 08 Октября, 2014 - 20:48:47
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




teddy, без изменений
 
 Top
teddy
Отправлено: 08 Октября, 2014 - 20:50:01
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Bio man
Уверен? У меня все нормально отработало. Может косяк где то в другом месте?

Да кстати, в xPath считается от 1, а не от 0
 
 Top
Bio man
Отправлено: 08 Октября, 2014 - 20:56:13
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




teddy пишет:
Да кстати, в xPath считается от 1, а не от 0
я знаю, но выражение position() > 0 отработает корректно.

попробуй сам, вот ссылка
http://www[dot]ticketland[dot]ru/cirki/c[dot][dot][dot]e-predstavlenie/

попробуй получить первые 3 сеанса только из 1 вкладки, но без указания первой вкладки в запросе (суть в том что бы эмулировать offset и limit). первые 3 это для примера, может понадобится получит с 10 по 15, к примеру.

я прямо в браузере xPath проверяю (xPath helper для хрома)

ща на сервере проверю для полной уверенности
(Добавление)
Bio man пишет:
ща на сервере проверю для полной уверенности
да, всё так же как было
 
 Top
teddy
Отправлено: 08 Октября, 2014 - 21:04:11
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Bio man
А какую именно часть из блока-сеанса нужно получить? т.е какие элементы
И пробовал ли ты указать абсолютный пусть до элемента без рекурсии?

(Отредактировано автором: 08 Октября, 2014 - 21:04:57)

 
 Top
Bio man
Отправлено: 08 Октября, 2014 - 21:07:12
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




teddy пишет:
А какую именно часть из блока-сеанса нужно получить?
да по сути это не важно. ссылку на сеанс.
teddy пишет:
И пробовал ли ты указать абсолютный пусть до элемента без рекурсии?
попробовал, без изменений
 
 Top
teddy
Отправлено: 08 Октября, 2014 - 21:23:50
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. //div[@class="hall"][position() <= 3]/a[1]

достал элементы <a> таким выражением(первые три)
(Добавление)
т.е в каждом таком блоке достал первую ссылку. их там по две
(Добавление)
CODE (htmlphp):
скопировать код в буфер обмена
  1. //div[@class="showshedule"][1]//div[@class="hall"][position() <= 3]/a[1]

Вот так из первой вкладки
 
 Top
Bio man
Отправлено: 09 Октября, 2014 - 01:43:34
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




teddy, ты видимо меня не так понял.
я и сам могу получить все ссылки, проблема в другом.

я хочу получить элементы на определённых позициях, будто родителя .month не существует и все элементы .perform идут списком.
если выбирать по запросу //div[@class="perform"] или по похожему, то будет выбираться по сету элементов (с заданными мною позициями) из каждого элемента .month.

Похоже, что нельзя так сделать.
(Добавление)
но всё таки интересно, почему на двух разных машинах разные результаты..
на локалке выбирает как мне надо, а на сервере выбирает так, как я описал выше, то есть уже не так.
может в 5.5 исправили поведение (на локале 5.5), на серваке 5.4
(Добавление)
Да, точняк. Такое поведение из-за версии, но не пхп а libxml. в 2.7 плохо работает, в 2.9 хорошо.

Пойду обходным путём, пусть будет незначительный оверхед на сканирование всех элементов, а потом массив порежу как мне надо
 
 Top
teddy
Отправлено: 09 Октября, 2014 - 18:28:34
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Вообщем как я понял у тебя проблема с расчетом offset и limit, а так же с выборкой данных из конкретного блока. Это вполне решаемый вопрос.

В этом спойлере разметка на которой я тестировал код, который лежит в нижнем спойлере.
Спойлер (Отобразить)

PHP код
Спойлер (Отобразить)

Это выражение вернет из всех блоков с классом month элементы a с учетом limit и offset.
Если не нужно из всех блоков с классом .month а из конкретного, можно явно указать, конкретно из какого .month нужно забрать сет элементов с учетом limit и offset. Для этого понадобится ещё одна переменная, например $monthPos.
Пусть она к примеру будет равна 2, т.е делаем выборку из второго блока с классом month.
PHP:
скопировать код в буфер обмена
  1.  
  2. ...
  3. $monthPos = 2;
  4. $nodeList = $xPath->query('//div[@class="month"]['.$monthPos.']/a[position() > '.$offset.' and position() <= '.$xPathLimit.']');

Если остались вопросы, пиши.
 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Октября, 2014 - 05:54:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Bio man, попробуйте с использованием скобок:
(//div[@class="perform"])[position() <= 3]
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« XML и его обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB