【问题标题】:Xpath how to select children? [duplicate]Xpath如何选择孩子? [复制]
【发布时间】:2015-10-31 01:27:36
【问题描述】:

我想选择当前 div 节点的子节点并将它们保存到变量中:

<div id="summary">
<p>aaaaaaa</p>
<p>bbbbbbb</p>
<br>
<p>ccccccc</p>
<a></a>
<p>ddddddd</p>
</div>

我试过了

$summary = $dom->saveHTML($xpath->query('//div[@id="summary"]/child::*')->item(0));

但它只返回第一个 P 标签,这对我来说很奇怪,因为 '*' 应该得到所有的孩子,所以我可以在哪里修复它来选择所有的孩子而不是只选择第一个?

【问题讨论】:

  • 为什么以-&gt;item(0)结尾?听起来那是罪魁祸首。
  • @pritaeas 原因 saveHTML 需要传递节点而不是节点列表
  • @user7031:你很可能在这里拥有an XY problem

标签: php xpath domdocument


【解决方案1】:

两个罪魁祸首是 saveHTML 和“->item(0)”。该查询返回一个值数组,您可以通过 foreach 循环访问每个元素。

<?php
$content = 
'<div id="summary">
<p>aaaaaaa</p>
<p>bbbbbbb</p>
<p>ccccccc</p>
<a></a>
<p>ddddddd</p>
</div>';
$xml = new SimpleXMLElement($content);


$entries =  $xml->xpath('//div[@id="summary"]/child::*');
foreach ($entries as $entry) {
    echo $entry;
}
?>

我删除了一个格式良好的例子的中断。在上面的代码中,$entries 包含一个包含所有适当值的数组(从 aaaaaaa 到 dddddddd)。 “item(0)”访问数组的第一个元素。你的 Xpath 是正确的,但是这两个函数的使用是错误的。问题是,您是要分配给变量,还是要序列化结果?

saveHTML 将您使用“createElement”创建的文档转储到一个字符串中。将信息保存在变量中非常简单,就像分配给它一样。

【讨论】:

  • 我以为child语句会把所有的children作为一个整体返回,结果错了,有没有什么方法可以把children作为一个整体返回而不是nodelist呢?
  • 换句话说,想暂时保留孩子周围的标签、其他元数据和值,而不是仅仅抓取值?如果是这样,您将研究像 preg_match() 这样的 正则表达式工具,而不是 Xpath 查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2014-04-24
  • 2021-02-05
相关资源
最近更新 更多