Ответ 1
Передайте node в качестве второго аргумента DOMXPath::query
contextnode. Необязательный contextnode может быть указан для выполнения относительных запросов XPath. По умолчанию запросы относятся к корневому элементу.
Пример:
foreach ($nodes as $node) {
foreach ($x_path->query('h3|a', $node) as $child) {
echo $child->nodeValue, PHP_EOL;
}
}
Это использует оператор UNION для результата
Get me 1
and me too 1
Get me 2
and me too 1
Если вам не нужны сложные запросы, вы также можете сделать
foreach ($nodes as $node) {
foreach ($node->getElementsByTagName('a') as $a) {
echo $a->nodeValue, PHP_EOL;
}
}
Или даже путем итерации дочерних узлов (обратите внимание, что это включает в себя все текстовые узлы)
foreach ($nodes as $node) {
foreach ($node->childNodes as $child) {
echo $child->nodeName, PHP_EOL;
}
}
Тем не менее, все это не требуется, поскольку вы можете напрямую получить эти узлы:
$nodes= $x_path->query("/html/body//div[@class='listing']/div[last()]");
foreach ($nodes as $i => $node) {
echo $i, $node->nodeValue, PHP_EOL;
}
предоставит вам два узла в последнем дочернем элементе div всех атрибутов с атрибутом класса для перечисления и вывода комбинированных значений текста node, включая пробелы
0
Get me 1
and me too 1
1
Get me 2
and me too 1
Аналогично, следующее
"//div[@class='listing']/div[last()]/node()[name() = 'h3' or name() = 'a']"
предоставит вам четыре дочерних узла H3 и A и выводит
0Get me 1
1and me too 1
2Get me 2
3and me too 1
Если вам нужно дифференцировать их по имени, итерации по ним, вы можете сделать
foreach ($nodes as $i => $node) {
echo $i, $node->nodeName, $node->nodeValue, PHP_EOL;
}
который затем даст
0h3Get me 1
1aand me too 1
2h3Get me 2
3aand me too 1