gpt4 book ai didi

php - 如何在 DOMNode 上执行 XPath 查询?

转载 作者:IT王子 更新时间:2023-10-29 00:00:54 27 4
gpt4 key购买 nike

有没有办法在 DOMNode 上进行 xpath 查询?或者至少将其转换为 DOMXPath?

<html>
...
<div id="content">
...
<div class="listing">
...
<div></div>
<div></div>
<div class='foo'>
<h3>Get me 1</h3>
<a>and me too 1</a>
</div>
</div>
<div class="listing">
...
<div></div>
<div></div>
<div class='foo'>
<h3>Get me 2</h3>
<a>and me too 1</a>
</div>
</div>
....
</div>
</html>

这是我的代码。我正在尝试获取一个数组列表,其中包含 h3 的值和每个数组中的标签。为此,我需要获取每个列表,然后在每个列表中获取 h3 和标签的值。

$html_dom = new DOMDocument();
@$html_dom->loadHTML($html);
$x_path = new DOMXPath($html_dom);

$nodes= $x_path->query("//div[@id='content']//div[@class='listing']");

foreach ($nodes as $node)
{
// I want to further dig down here using query on a DOMNode
}

最佳答案

将节点作为第二个参数传递给 DOMXPath::query

contextnode: The optional contextnode can be specified for doing relative XPath queries. By default, the queries are relative to the root element.

例子:

foreach ($nodes as $node) {
foreach ($x_path->query('h3|a', $node) as $child) {
echo $child->nodeValue, PHP_EOL;
}
}

这使用了 UNION operator结果

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 的最后一个 div 子节点中的两个节点,其类属性值为 listing 并输出组合的文本节点值,包括空格

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

关于php - 如何在 DOMNode 上执行 XPath 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16727378/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com