EllaJo
EllaJo

Reputation: 235

Error: Non Object on DOMElement

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 is an array of strings. When I run the code, it give me a "Call to member function hasAttributes() on non-object" error for the line that calls hasAttributes. When it's not commented out, I get the same error on the line that calls hasAttribute('body'). I tried a var_dump on $p, on the line just after the call to getElementsByTagName, and I got "object (DOMElement) [5]". Well, the number changed because I was running the code on multiple files at once, but I didn't know what the number meant. I can't find what I'm doing wrong.

Upvotes: 0

Views: 853

Answers (2)

user743234
user743234

Reputation:

It should be because there is no <body> tag in your DOM Document.

Upvotes: 1

Yoshi
Yoshi

Reputation: 54649

with:

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

You are executing: DOMNodelist::item (See: http://www.php.net/manual/en/domnodelist.item.php) which returns NULL if, at the given index, no element is found.

But you're not checking for that possibility, you're just expecting $p to be not null. Try adding something like:

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

Although, if you're sure that there should be a body element, you'll probably have to check your file paths.

Upvotes: 1

Related Questions