QueryPath поддерживает свое состояние внутри (в отличие от jQuery) по соображениям производительности.Таким образом, branch()
- это путь.
В качестве модификации предложенного решения я бы предложил минимизировать количество вызовов find (), выполнив это:
$qp = htmlqp($url);
foreach ($qp->find('table#schedule tr') as $tr){
echo 'date: ';
echo $tr->branch('.eventdate')->text();
echo ' time: ';
echo $tr->branch('.dtstart')->text();
echo '<br>';
}
Наконец, всякий раз, когда вы делаете «разрушительное» действие (например, find()
), вы всегда можете вернуться на один шаг назад, используя end()
.Таким образом, вышеприведенное также можно сделать следующим образом:
$qp = htmlqp($url);
foreach ($qp->find('table#schedule tr') as $tr){
echo 'date: ';
echo $tr->find('.eventdate')->text();
echo ' time: ';
echo $tr->end()->find('.dtstart')->text();
echo '<br>';
}
Это ОЧЕНЬ ОЧЕНЬ незначительное улучшение производительности, но я предпочитаю метод branch()
, если я не работаю с документами размером более 1M.
В QueryPath 3.x, в котором есть целый ряд новых улучшений производительности, я согласен с идеей использования способа jQuery для создания нового объекта для каждой функции.К сожалению, этот метод будет использовать гораздо больше памяти, поэтому я не могу сохранить его.Хотя branch()
требуется немного времени, чтобы учиться, у него есть свои преимущества.