假设你有类似的东西
<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
}
但是,您如何单独选择每个 div,然后在每个 div 中工作,或者在 DOM XPath 中执行等效操作?如果我说
$query = $data->query('//div');
我会得到一个 DOMElements 列表,据我所知,它不能在另一个 DOM XPath 中使用(现在我想如果它可以工作的话),所以我不能嵌套 XPath 请求,或者至少我没有得到任何当我尝试使用 nodeValue / textValue 并使用它创建一个新的 DOMDocument 和 DOMXPath 时返回的结果。nodeValue / textValue 似乎已剥离所有标签,这就是我认为它没有返回任何结果的原因。
现在我可以在这种情况下用 '\n' 分隔并解析 nodeValue,但想象在每个 div 中,每种类型的子节点的数量都是无限的,我们正在寻找 5 层以下的东西。然后那会变成一个巨大的丑陋的烂摊子。
基本上,SimpleXMLElement->xpath 保留了文档结构,而 DOM XPath 似乎没有。
那么,有没有一种很好的通用方法呢?