为什么XPath查询只返回最后一个匹配?

时间:2012-11-24 14:16:13

标签: php xpath

XPath查询只能返回最后一个匹配的原因是什么?我正在对一个显然有多个<a name="...">标签的HTML片段运行查询,但XPath查询只会返回一个元素,这恰好是最后一个元素。

function extract($html) {
    // This test shows that the retrieved HTML fragment indeed contains multiple anchor tags
    echo "<textarea>".$html."</textarea>";

    // parse the data
    $dom = new DomDocument();
    @$dom->loadHTML($html); // we use @$dom to suppress some warnings
    $xpath = new DOMXPath($dom);

    // find the html code for the post
    $query = "//a[contains(@name, 'post')]"; 
    $rows = $xpath->query($query);

    // This will return 1
    echo "Elements found: " . count($rows);

    ...
}

1 个答案:

答案 0 :(得分:4)

您需要探测$rows->length。原因是$rowsDOMNodeList的实例(一个包含DOMNode个实例列表的对象)。由于DOMNodeList未实现接口Countable,因此count()无法按照您期望的方式进行探测。它只返回1,因为它是单个对象,而不是它聚合的DOMNode的数量。

因此,您的查询结果仅返回最后一个匹配项。它返回所有内容,您可以使用foreach迭代它们,如下所示:

foreach( $rows as $row )
{
    // do something with $row (instance of DOMNode)
}

...或者使用for循环,如下所示:

for( $i = 0, $len = $rows->length; $i < $len; $i++ )
{
    $row = $rows->item( $i );
    // do something with $row (instance of DOMNode)
}

......等等。