2011-11-15 27 views
8

Tengo dificultades para entender cómo usar el objeto DOMElement en PHP. He encontrado este código, pero no estoy muy seguro de que es aplicable a mí:Uso de PHP para obtener el elemento DOM

$dom = new DOMDocument(); 
$dom->loadHTML("index.php"); 

$div = $dom->getElementsByTagName('div'); 
foreach ($div->attributes as $attr) { 
    $name = $attr->nodeName; 
    $value = $attr->nodeValue; 
    echo "Attribute '$name' :: '$value'<br />"; 
} 

Básicamente lo que necesito es buscar en el DOM para una element con una determinada id, después de lo cual punto que necesitan para extraer un no -standard attribute (es decir, uno que inventé y puse con JS) para que pueda ver el valor de eso. La razón es que necesito una pieza del $_GET y una pieza que está en el HTML basada en un redireccionamiento. Si alguien pudiera explicar cómo uso DOMDocument para este propósito, sería útil. Realmente estoy luchando por entender qué está pasando y cómo implementarlo correctamente, porque claramente no lo estoy haciendo bien.

EDITAR (donde estoy basado en comentario):

Ésta es mis líneas de código 4-26 para la referencia:

<div id="column_profile"> 
    <?php 
     require_once($_SERVER["DOCUMENT_ROOT"] . "/peripheral/profile.php");    
     $searchResults = isset($_GET["s"]) ? performSearch($_GET["s"]) : ""; 

     $dom = new DOMDocument(); 
     $dom->load("index.php"); 

     $divs = $dom->getElementsByTagName('div'); 
     foreach ($divs as $div) { 
      foreach ($div->attributes as $attr) { 
       $name = $attr->nodeName; 
       $value = $attr->nodeValue; 
       echo "Attribute '$name' :: '$value'<br />"; 
      } 
     } 
     $div = $dom->getElementById('currentLocation'); 
     $attr = $div->getAttribute('srckey'); 
     echo "<h1>{$attr}</a>"; 
    ?> 
</div> 

<div id="column_main"> 

Aquí está el mensaje de error que estoy recibiendo:

Warning: DOMDocument::load() [domdocument.load]: Extra content at the end of the document in ../public_html/index.php, line: 26 in ../public_html/index.php on line 10 

Fatal error: Call to a member function getAttribute() on a non-object in ../public_html/index.php on line 21 
+0

'index.hp' no se ejecutará. 'loadHTML' solo lee el contenido del archivo, no lo ejecuta. Es posible que deba hacer algo como: '$ dom-> loadHTML (file_get_contents ('http: //localhost/index.php'))'. –

Respuesta

14

getElementsByTagName le devuelve una lista de elementos, por lo que primero que hay que recorrer los elementos, a continuación, a través de sus atributos.

$divs = $dom->getElementsByTagName('div'); 
foreach ($divs as $div) { 
    foreach ($div->attributes as $attr) { 
     $name = $attr->nodeName; 
     $value = $attr->nodeValue; 
     echo "Attribute '$name' :: '$value'<br />"; 
    } 
} 

En su caso, usted dijo que necesitaba una identificación específica. Los que se supone que son únicos, por lo que hacer eso, puede utilizar (nota getElementById podría no funcionar a menos que llame $dom->validate() primero):

$div = $dom->getElementById('divID'); 

Luego de obtener su atributo:

$attr = $div->getAttribute('customAttr'); 

EDITAR: $dom->loadHTML acaba de leer el contenido del archivo, no los ejecuta. index.php no se ejecutará de esta manera. Es posible que tenga que hacer algo como:

$dom->loadHTML(file_get_contents('http://localhost/index.php')) 
+1

¿Funciona esto si su HTML no contiene una declaración de tipo de documento? Un comentario en la página de documentación [DOMDocument :: getElementById] (http://us3.php.net/manual/en/domdocument.getelementbyid.php) sugiere que si el HTML no contiene una declaración de tipo de documento. 'getElementById()' siempre devuelve 'null'. –

+0

No estoy seguro de lo que ese comentario está tratando de decir. 'DOMDocument' funciona bien en HTML sin un' '. Demostración: https://3v4l.org/0mGrg –

+0

Sí, estoy usando la biblioteca DOM para componer HTML de esa manera. Pero estoy tratando de ejecutar pruebas contra el HTML compuesto.'getElementById()' siempre devuelve 'null' incluso cuando está claramente en el HTML renderizado. –

1

No tendrá acceso al HTML si la redirección proviene de un servidor externo. Déjame ponerlo de esta manera: el DOM no existe en el punto en que intentas analizarlo. Lo que puedes hacer es pasar el texto a un analizador DOM y luego manipular los elementos de esa manera. O la mejor manera sería agregarlo como otra variable GET.

EDITAR: ¿Sabe también que el cliente puede cambiar el HTML y hacer que pase lo que quiera? (Usando una herramienta como Firebug)

Cuestiones relacionadas