gpt4 book ai didi

php - 嵌套的 DOM XPath?

转载 作者:可可西里 更新时间:2023-10-31 22:12:33 27 4
gpt4 key购买 nike

假设你有类似的东西

<div>
<p>...</p>
<p>There are an unbounded number of these p tags</p>
<p>etc etc...could be 4 of these one time, then 9 the next time</p>
</div>
<div>
<p>Same here, an unbounded number</p>
<p>etc</p>
</div>
<div>
<p>And so on...</p>
<p>...</p>
<p>...</p>
<p>...</p>
</div>

假设我想从第一个 div 中获取第一个 p 节点,从第二个 div 中获取第二个 p 节点,从第三个 div 中获取第三个 p 节点。现在,如果这是 xml,我会使用 SimpleXMLElement 并执行类似的操作

foreach ($data->xpath('//div') as $cur){
//Then work within each <div> that is returned, could even xpath this again if I needed to
}

但是如何在 DOM XPath 中单独选择每个 div,然后在每个 div 中工作,或做等效的事情?如果我说

$query = $data->query('//div');

我会得到一个 DOMElement 列表,据我所知,它不能在另一个 DOM XPath 中使用(现在如果可以的话,我想它可以工作),所以我不能嵌套 XPath 请求,或者至少我是当我尝试使用 nodeValue/textValue 并使用它创建新的 DOMDocument 和 DOMXPath 时,没有得到返回的任何结果。 nodeValue/textValue 似乎剥离了所有标签,这就是我认为它没有返回任何结果的原因。

现在我可以在这种情况下用 '\n' 分隔并解析 nodeValue,但想象一下,在每个 div 中,每种类型的子节点的数量都是无限的,我们正在寻找比方说向下 5 级的东西。然后那会变成一个巨大的丑陋的烂摊子。

基本上,SimpleXMLElement->xpath 保留了文档结构,而 DOM XPath 似乎没有。

那么,有没有一种好的通用方法可以做到这一点?

最佳答案

您可以访问嵌套元素。例如,如果您想要访问第二个 div 的第一段中的文本,您可以按如下方式进行:

$doc = new DOMDocument();
if ( ! @$doc->loadHTML($html)){
return FALSE;
}
$xpath = new DOMXPath($doc);
$res = $xpath->query('//div');
$sub = $xpath->query('.//p', $res->item(1));//paragraphs of second div
echo trim($sub->item(0)->nodeValue);//first paragraph

请注意,$sub 是相对于存储在 $res 中的第一个查询的查询。

输出是:

这里也一样,一个无界数

关于php - 嵌套的 DOM XPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16951770/

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