PHP Xpath,帮助选择一个非常特定的节点

时间:2010-05-17 11:51:30

标签: php dom xpath

昨晚的类似问题,我无法编辑源HTML,我试图从网站上解析大量数据来进行产品价格/比较。在大多数情况下,它正在发挥作用,但我现在正试图让它更有效,更快速,更容易阅读我的意大利面条代码。

我有以下测试代码;而我想要做的只是返回内容的属性(例如thisiswhatiwant)如果 productType的nodeValue是Stocked而没有别的。

<div id="productListing">

<div class="productDetail">
    <span class="productType">Stocked</span>: <span class="productStock"><span class='productContent' content='thisiswhatiwant'></span></span>
</div>

<div class="productDetail">
    <span class="productType">Non-stocked</span>: <span class="productStock"><span class='productContent' content='xyz'></span></span>
</div>

…

<div class="productDetail">
    <span class="productType">Non-stocked</span>: <span class="productStock"><span class='productContent' content='123'></span></span>
</div>

</div>

这是我到目前为止的Xpath查询,但是我要么缺少一些重要的东西,要么我脑子里的东西还没有点击装备。

//div[@id="productListing"]/div[@class="productDetail"]/span[@class="productStock"]/preceding-sibling::span[text()="Stocked"]

基本上,我想从上面的测试代码输出的内容是:

<?
echo "Output: " . $dom->getAttribute('content');
?>

Output: thisiswhatiwant

有人有任何想法吗?

1 个答案:

答案 0 :(得分:2)

假设$dom是从给定XML字符串创建的DomDocument对象:

$xpath = new DOMXPath($dom);
$q = '//span[@class="productType" and text()="Stocked"]/ancestor::*[@class="productDetail"]/span[@class="productStock"]/span[@class="productContent"]';
$res = $xpath->query($q);
foreach($res as $node) {
    echo $node->getAttribute('content') . PHP_EOL;
}