php - xpath выберите элемент, а затем выберите детей - PullRequest
0 голосов
/ 10 октября 2019

Есть ли способ в xpath выбрать элемент, а затем выбрать дочерние элементы этого элемента?

то есть с учетом родительского результата, как найти дочерний элемент, относящийся к this paraent

предположим, что следующий код:

<div class="product-general" prod-id="4407">
  <img src="..."/>
  <div class="prod-name">Black Dog</div>
</div>

в jQuery можно сделать:

parent = $('.product-general')
id = parent.attr('prod-id')
name = $('.prod-name', parent).text()

У меня есть следующий код (php):

    $results = $xpath->query("//*[@class='product-general']");
    for ($i = 0; $i < $results->length; $i++) {
        $parent = $results->item($i)->nodeValue;
        // todo: get prod-id and prod-name
    }

Можно ли получить идентификатор и имя продукта, относящиеся кродитель?

ПРИМЕЧАНИЕ: я знаю, что могу сделать это следующим образом:

    $results = $xpath->query("//*[@class='product-general']/@data-pid");
    for ($i = 0; $i < $results->length; $i++) {
        $pid = $results->item($i)->nodeValue;
        $results2 = $xpath->query("//*[@class='product-general' and @data-pid='".$pid."']//*[contains(@class,'prod-name')]");//
        $name= $results2->item(0)->nodeValue;
        $this->products[] = ['pid' => $pid, 'name' => $name];
    }

Но я хочу знать, есть ли что-то более элегантное, например, пример JQ

Кроме того, это решение мучительно медленно для документа с 1000 продуктами

10x

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Второй параметр query - это $contextnode, поэтому вы можете использовать относительный XPath , например:

foreach ($articles as $article) {
    $href = $xpath->query('./a/@href', $article)->item(0)->nodeValue;
    # $href = $xpath->evaluate('string(./a/@href)', $article); # using evaluate
}
0 голосов
/ 03 ноября 2019

Я придумал это:

$results = $xpath->query("//*[@id='searchPage']//article");
for ($i = 0; $i < $results->length; $i++) {
    $counter = $i+1;
    $href = $xpath->query("//*[@id='searchPage']//article[".$counter."]/a/@href")->item(0)->nodeValue;
}

Этот код будет зациклен на всех article в searchPage и извлечет их <a href="...">

Ключевая идея заключается в том, что, добавляя[".$counter."] к запросу u может использовать индекс текущего цикла в качестве контекста для поиска подэлементов

Обратите внимание, что $counter = $i+1;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...