Error: no objeto en 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 es una matriz de cadenas. Cuando ejecuto el código, me da un error "Llamar a la función miembro hasAttributes () en un no-objeto" para la línea que llama a hasAttributes. Cuando no está comentado, aparece el mismo error en la línea que llama a hasAttribute ('body'). Probé un var_dump en $ p, en la línea justo después de la llamada a getElementsByTagName, y obtuve "object (DOMElement) [5]". Bueno, el número cambió porque estaba ejecutando el código en varios archivos a la vez, pero no sabía qué significaba el número. No encuentro lo que estoy haciendo mal.

preguntado el 16 de mayo de 11 a las 16:05

¿Por qué estás cargando el dom 2 veces? ¿Por qué no pasar? $newHandle a la función? Mi conjetura es que si tu var_dump($dom->loadHTMLFile($filePath)); se encuentra null. -

Llamé a dom dos veces porque he construido el código una función a la vez, ejecutando cada función y luego integrándolo con las otras funciones y luego depurando porque las cosas siguen explotando. No me di cuenta de esto, y gracias por señalarlo. :-) Cuando var_dump en $ dom-> loadHTMLFile, obtengo un valor booleano True en todos los archivos. Seguido por el error que estoy llamando hasAttributes en un no objeto. -

2 Respuestas

con:

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

Estás ejecutando: DOMNodelist::item (Ver: http://www.php.net/manual/en/domnodelist.item.php) que regresa NULL si, en el índice dado, no se encuentra ningún elemento.

Pero no está buscando esa posibilidad, solo está esperando $p no ser nulo. Intente agregar algo como:

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

Aunque, si está seguro de que debería haber un elemento de cuerpo, probablemente tendrá que verificar las rutas de sus archivos.

contestado el 16 de mayo de 11 a las 20:05

Sé que hay una etiqueta corporal, pero no sé si tiene atributos. Lo que estoy tratando de hacer es extraer los atributos onLoad y onUnload del código del cuerpo y pegarlos en una variable para pasarlos a otro documento (incluido). Si no hay una etiqueta de cuerpo, ¿no debería el mensaje de error decirme qué archivo está rompiendo el código? - EllaJo

No necesariamente, porque getElementsByTagName siempre devuelve un DOMNodelist y DOMNodelist::item siempre regresa ya sea nulo or DOMNOde. Es por eso que tendrá que verificar el tipo de devolución. Sin embargo, podrías intentar: if (!($p instanceof DOMNode)) {/*fallback code*/} para obtener archivos sin etiqueta corporal. - Yoshi

Gracias, Yoshi. Creo que lo ha solucionado, pero cuando agregué la instancia de código if, terminé con alrededor de 200 errores de etiqueta no coincidentes, así que tengo que resolverlos ahora mismo. Quien quiera que codificara esto parecía pensar eso y son lo mismo. - EllaJo

Debería ser porque no hay <body> etiqueta en su documento DOM.

contestado el 16 de mayo de 11 a las 21:05

por cierto ... resulta que tenías razón. No hay etiqueta del cuerpo en aproximadamente la mitad de los documentos de esta carpeta. ~ suspiro Odio arreglar el código de otra persona. ¡Prefiero empezar de cero! - EllaJo

Solo dame un voto o márcalo bien: A veces sé que algunas cosas básicas pueden gobernar todo. - usuario743234

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.