PHP中DOMNode的getAttribute()不能与DOMXPath查询中的变量一起使用。为什么?

时间:2012-01-13 03:57:57

标签: php dom dom-node

我有一个带开关的程序:

$htmlContent = file_get_contents('http://somesite.com');
$htmlDOM->loadHTML( $htmlContent );
$htmlXPath = new DOMXPath( $htmlDOM );

for($i = 0; $i <= 16; $i++ ) {
    switch($i) {
        case 0:
            $link = utf8_decode($htmlXPath->query('/html/body/div[2]/div[2]/div/div/div/div/div[2]/div/a')->item(0)->getAttribute('href'));
            break;
        case 1:
            $link = utf8_decode($htmlXPath->query('/html/body/div[2]/div[2]/div/div/div/div/ul/li/div/a')->item(0)->getAttribute('href'));
            break;
        default:
            $link = utf8_decode($htmlXPath->query('/html/body/div[2]/div[2]/div/div/div/div/ul/li[' . $i . ']/div/a')->item(0)->getAttribute('href'));
            break;
    }
}

对于案例0和案例1的工作方式与预期相同,但默认情况下会抛出此错误:

PHP Fatal error:  Call to a member function getAttribute() on a non-object

我可以想象它是因为$ i而发生的,但我该如何解决这个问题呢?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

查询很可能无法找到任何内容并返回零长度节点列表。尝试从空列表中获取节点将返回false,而不是对象。

使用中间持有人检查:

,而不是假设查询成功
$nodes = $htmlXPath->query('/html/body/div[2]/div[2]/div/div/div/div/div[2]/div/a');
if ($nodes->length > 0) {
   $link = $nodes->item(0)->getAttribute('href'));
}