2010-08-29 15 views
5

test.html¿Qué estoy haciendo mal con xpath?

<html> 
    <body> 
     <span> hello Joe</span> 
     <span> hello Bob</span> 
     <span> hello Gundam</span> 
     <span> hello Corn</span> 
    </body> 
</html> 

archivo PHP

$doc = new DOMDocument(); 
$doc->loadHTMLFile("test.html"); 

$xpath = new DOMXPath($doc); 

$retrieve_data = $xpath->evaluate("//span"); 

echo $retrieve_data->item(1); 
var_dump($retrieve_data->item(1)); 
var_dump($retrieve_data); 

Estoy tratando de utilizar XPath para encontrar las luces y luego echo, pero parece que no puedo repetir la misma. He intentado deshacerse de ellos para ver si está evaluando adecuadamente, y no estoy seguro de lo que quiere decir esto de salida:

object(DOMElement)#4 (0) { } 
object(DOMNodeList)#7 (0) { } 

lo que hace el #4 y #7 significa y qué significa el paréntesis; ¿Qué significa la sintaxis?

Actualización: Este es el error que consigo cuando intento echo $retrieve_data; y $retrieve_data->item(1);

Catchable fatal error: Object of class DOMNodeList could not be converted to string 
+0

No es una respuesta a su pregunta, pero hay bibliotecas DOM PHP que permiten consultar objetos de la manera jQuery que se siente mucho más natural para mí que XPath. Yo * odio * XPath. [PHPQuery] (http://code.google.com/p/phpquery/) utiliza el PHP DOM - ejemplos [aquí] (http://phpquery-library.blogspot.com/); [SimpleHTMLDOM] (http://simplehtmldom.sourceforge.net/) está basado en cadenas pero también es muy agradable. –

+0

No conozco la sintaxis XPath de PHP, pero ¿has probado "// span/text()"? Actualmente, está seleccionando los elementos, pero desea generar el texto dentro de los elementos. –

+1

@chris_l No es ** PHP ** sintaxis XPath. Es solo XPath. Lo mismo en cualquier otro idioma, solo que PHP solo es compatible con XPath 1.0. @Doug tu pregunta no tiene nada que ver con XPath. Usted está preguntando cómo leer la salida estándar 'var_dump'. – Gordon

Respuesta

2

Si desea texto de salida en el interior lapso puede utilizar textContent propiedad:

echo $ retrieve_data-> material (1) -> textContent;

+0

Probé echo '$ retrieve_data-> item (1);' anterior. ¿No debería hacerse eco del span html? Además, ¿dónde puedo encontrar la documentación para la parte de textoContenido? No sabía que puedes hacer eso. – Strawberry

+0

Al igual que VdesmedT, el artículo siguiente (1) no es una cadena: es un objeto Nodo que puede incluir muchas cosas además de texto y nombre. La clase base para todos los nodos se describe (con todas las propiedades disponibles) aquí: http://www.php.net/manual/en/class.domnode.php – Shcheklein

1

Si desea que el XML (o HTML en lugar), Proveedores:

echo $doc->saveXML($retrieve_data->item(1)); 

BTW , el DOMNodeList, que es el resultado de su consulta, tiene índice cero base, por lo que el primer elemento sería 0. Pero tal vez ya lo sabías.

1

su artículo es como objeto DOMNode, eco de su fuerza nodeValue propiedad ayuda

+0

No tengo idea de lo que dijo. ¿Cuál es su nodeValue? Como el artículo (1)? – Strawberry

+0

echo $ retrieve_data-> item (1) -> nodeValue; – VdesmedT

3
$xpath->evaluate("//span"); 

devuelve un resultado mecanografiado si es posible o un DOMNodeList que contiene todos los nodos que coinciden con la expresión XPath dada. En su caso, devuelve un DOMNodeList, porque su XPath evalúa a cuatro DOMElements, que son especializados DOMNodes. Comprender el concepto de nodo al trabajar con cualquier XML, independientemente de en qué idioma, es crucial.

echo $retrieve_data->item(1); 

no puede funcionar, porque DOMNodeList::item devuelve un DOMNode y más específicamente un DOMElement en su caso. No puede echo objetos de ningún tipo en PHP, si no implementan el método __toString(). DOMElement no. Tampoco lo hace DOMNodeList. En consecuencia, se obtiene el error fatal de que el objeto no se puede convertir en cadena.

Para obtener los valores de DOMElement, puede leer sus nodeValue o textContent.

Algunos ejemplos DOM por mí: https://stackoverflow.com/search?q=user%3A208809+dom

Cuestiones relacionadas