错误:DOMElement上的非对象

时间:2011-05-16 16:47:29

标签: php dom

foreach ($filePaths as $filePath) {
/*Open a file, run a function to write a new file 
that rewrites the information to meet design specifications */
$fileHandle = fopen($filePath, "r+");

$newHandle = new DOMDocument();
$newHandle->loadHTMLFile( $filePath );
$metaTitle = trim(retrieveTitleText($newHandle));
$pageMeta = array('metaTitle' => $metaTitle, 'pageTitle' => 'Principles of Biology' );
$attributes = retrieveBodyAttributes($filePath);

cleanfile($fileHandle, $filePath);

fclose($fileHandle);
}

function retrieveBodyAttributes($filePath) {
$dom = new DOMDocument;
$dom->loadHTMLFile($filePath);
$p = $dom->getElementsByTagName('body')->item(0);
/*if (!$p->hasAttribute('body')) {
    $bodyAttr[] = array('attr'=>" ", 'value'=>" ");
    return $bodyAttr;
}*/
if ($p->hasAttributes()) {
    foreach ($p->attributes as $attr) {
        $name = $attr->nodeName;
        $value = $attr->nodeValue;
        $bodyAttr[] = array('attr'=>$name, 'value'=>$value);
    }
    return $bodyAttr;
}

}

$ filePaths是一个字符串数组。当我运行代码时,它为我调用hasAttributes的行给出了“对非对象的成员函数hasAttributes()的调用”错误。当它没有被注释掉时,我在调用hasAttribute('body')的行上得到了相同的错误。我在调用getElementsByTagName之后就在$ p上尝试了一个var_dump,我得到了“object(DOMElement)[5]”。好吧,数字改变了,因为我一次在多个文件上运行代码,但我不知道这个数字是什么意思。我找不到我做错了什么。

2 个答案:

答案 0 :(得分:1)

使用:

$p = $dom->getElementsByTagName('body')->item(0);

您正在执行:DOMNodelist::item(请参阅:http://www.php.net/manual/en/domnodelist.item.php)如果在给定索引处找不到任何元素,则返回 NULL

但是你没有检查这种可能性,你只是期望$p不为空。 尝试添加以下内容:

if ($p instanceof DOMNode) {
  // the hasAttributes code
}

虽然,如果您确定应该有一个body元素,那么您可能需要检查文件路径。

答案 1 :(得分:1)

应该是因为DOM文档中没有<body>标记。