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 :: Версия для печати :: xPath сошёл с ума
Форумы портала PHP.SU » » XML и его обработка » xPath сошёл с ума

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

1. Bio man - 08 Октября, 2014 - 20:33:27 - перейти к сообщению
такая ситуация.
имеется структура
Цитата:
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 запрос на локалке возвращает правильный результат, а на серваке результат описанный выше.
(Добавление)
источник один и тот же
2. teddy - 08 Октября, 2014 - 20:46:34 - перейти к сообщению
CODE (htmlphp):
скопировать код в буфер обмена
  1. //div[@class="perform"][position() <= 3]

Попробуй
3. Bio man - 08 Октября, 2014 - 20:48:47 - перейти к сообщению
teddy, без изменений
4. teddy - 08 Октября, 2014 - 20:50:01 - перейти к сообщению
Bio man
Уверен? У меня все нормально отработало. Может косяк где то в другом месте?

Да кстати, в xPath считается от 1, а не от 0
5. Bio man - 08 Октября, 2014 - 20:56:13 - перейти к сообщению
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 пишет:
ща на сервере проверю для полной уверенности
да, всё так же как было
6. teddy - 08 Октября, 2014 - 21:04:11 - перейти к сообщению
Bio man
А какую именно часть из блока-сеанса нужно получить? т.е какие элементы
И пробовал ли ты указать абсолютный пусть до элемента без рекурсии?
7. Bio man - 08 Октября, 2014 - 21:07:12 - перейти к сообщению
teddy пишет:
А какую именно часть из блока-сеанса нужно получить?
да по сути это не важно. ссылку на сеанс.
teddy пишет:
И пробовал ли ты указать абсолютный пусть до элемента без рекурсии?
попробовал, без изменений
8. teddy - 08 Октября, 2014 - 21:23:50 - перейти к сообщению
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]

Вот так из первой вкладки
9. Bio man - 09 Октября, 2014 - 01:43:34 - перейти к сообщению
teddy, ты видимо меня не так понял.
я и сам могу получить все ссылки, проблема в другом.

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

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

Пойду обходным путём, пусть будет незначительный оверхед на сканирование всех элементов, а потом массив порежу как мне надо
10. teddy - 09 Октября, 2014 - 18:28:34 - перейти к сообщению
Вообщем как я понял у тебя проблема с расчетом 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.']');

Если остались вопросы, пиши.
11. armancho7777777 - 10 Октября, 2014 - 05:54:02 - перейти к сообщению
Bio man, попробуйте с использованием скобок:
(//div[@class="perform"])[position() <= 3]

 

Powered by ExBB FM 1.0 RC1