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 :: Версия для печати :: Помогите разобраться с Symfony\DomCrawler и XPath
Форумы портала PHP.SU » » CMS и фреймворки » Помогите разобраться с Symfony\DomCrawler и XPath

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

1. nkl - 12 Марта, 2015 - 07:41:03 - перейти к сообщению
Доброго времени суток, коллеги! Со вчерашнего дня разбираюсь с этим икспасом. Хм

Я так понимаю, что симфонивский The DomCrawler Component - это ни что иное, как обертка над \DomDocument() и \DomXPath(), следовательно, кто знает эти либы, тот сможет мне помочь.

Поставил значит консольку для FireBag'а - FirePath (оч. удобная штука кстати, советую). Для примера взял одну из своих страничек. Пробую делать XPath-запросы. Получение одного элемента - не проблема, а вот получение массива элементов которые подпадают под один запрос - это да, это вертяк. Вот мой XPath-запрос:
PHP:
скопировать код в буфер обмена
  1. $elements = $crawler->filterXPath("html/body/div[2]/header/div/div[2]/ul/li");

Там в списке 11 итемов li, в $elements как положенно оказывается такой массив:
Спойлер (Отобразить)

Но, когда я пытаюсь перебрать его в цикле:
PHP:
скопировать код в буфер обмена
  1. foreach($elements as $domElemet){
  2.                 dump($domElemet->attr('class'));
  3.        }

Сифони выбрасывает такой эксепшен:
Цитата:
[Symfony\Component\Debug\Exception\UndefinedMethodException]
Attempted to call method "attr" on class "DOMElement".

А этот метод:
PHP:
скопировать код в буфер обмена
  1. $elements->count();

и вовсе возвращает 0. В офф документации в первом же примере указано, что nodeName - это атрибут экземпляра класса $domElement, а чуть ниже он приводиться уже как метод $domElement->nodeName(). Если обратиться к свойству nodeName то возвращает как положено 11 раз "li", в общем я ничего не пойму, каша какая-то в голове.

Что я делаю не так? Огорчение
(Добавление)
Все разобрался, там в документации чуть ниже есть такой метод (анонимная функция):
PHP:
скопировать код в буфер обмена
  1. $nodeValues = $crawler->filter('p')->each(function (Crawler $node, $i) {
  2.     return $node->text();
  3. });

Это работает! Я получил нужный мне текст.

 

Powered by ExBB FM 1.0 RC1