2010-08-29 4 views
5

test.htmlQu'est-ce que je fais de mal avec xpath?

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

fichier 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); 

Je suis en train d'utiliser XPath pour trouver les travées puis l'écho, mais il semble que je ne peux pas l'écho. J'ai essayé de dumping pour voir si l'évaluation est bien, et je ne suis pas sûr de ce que cela signifie de sortie:

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

Que signifie le #4 et #7 signifie et qu'est-ce que la parenthèse signifie; Quelle est la signification de la syntaxe?

Mise à jour: Ceci est l'erreur que je reçois lorsque je tente de echo $retrieve_data; et $retrieve_data->item(1);

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

Pas une réponse à votre question, mais il y a des bibliothèques PHP DOM qui permettent l'interrogation des objets comme jQuery qui me semble beaucoup plus naturel que XPath. Je * hais * XPath. [PHPQuery] (http://code.google.com/p/phpquery/) utilise PHP DOM - exemples [ici] (http://phpquery-library.blogspot.com/); [SimpleHTMLDOM] (http://simplehtmldom.sourceforge.net/) est basé sur une chaîne mais aussi très agréable. –

+0

Je ne connais pas la syntaxe XPath de PHP, mais avez-vous essayé "// span/text()"? Actuellement, vous sélectionnez les éléments, mais vous souhaitez afficher le texte dans les éléments. –

+1

@chris_l Ce n'est pas ** la syntaxe XPath ** de PHP. C'est juste XPath. Pareil dans n'importe quel autre langage, juste que PHP ne supporte que XPath 1.0. @Doug votre question n'a rien à voir avec XPath. Vous demandez comment lire la sortie 'var_dump' standard. – Gordon

Répondre

2

Si vous voulez texte de sortie à l'intérieur de la durée, vous pouvez utiliser la propriété textContent:

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

+0

J'essayais echo '$ retrieve_data-> item (1);' plus tôt. Cela ne devrait-il pas faire écho à l'échelle html? Où puis-je trouver la documentation pour la partie textContent? Je ne savais pas que tu pouvais le faire. – Strawberry

+0

Tout comme VdesmedT dit ci-dessous le point (1) n'est pas une chaîne - c'est un objet Node qui peut inclure beaucoup de choses à part le texte et le nom. La classe de base pour tous les nœuds est décrite (avec toutes les propriétés disponibles) ici: http://www.php.net/manual/fr/class.domnode.php – Shcheklein

1

Si vous voulez sortir le XML (ou HTML plutôt), essayez:

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

BTW , le DOMNodeList, qui est le résultat de votre requête, est indexé zéro base, donc le premier élément serait 0. Mais peut-être le saviez-vous déjà.

1

votre article est comme objet DOMNode, l'écho de sa puissance propriété nodeValue aide

+0

Je n'ai aucune idée de ce que vous dites. Quelle est sa nodeValue? Comme l'article (1)? – Strawberry

+0

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

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

retourne un résultat écrit si possible ou une DOMNodeList contenant tous les noeuds correspondant à l'expression XPath donnée. Dans votre cas, il renvoie un DOMNodeList, car votre XPath est évalué à quatre DOMElements, qui sont spécialisés DOMNodes. Comprendre le concept de Node lorsque vous travaillez avec n'importe quel XML, quelle que soit la langue, est crucial.

echo $retrieve_data->item(1); 

peut ne pas fonctionner, car DOMNodeList::item retourne un DOMNode et plus précisément un DOMElement dans votre cas. Vous ne pouvez pas echo objets d'aucune sorte en PHP, s'ils n'implémentent pas la méthode __toString(). DOMElement ne fait pas. Le DOMNodeList non plus. Par conséquent, vous obtenez l'erreur fatale que l'objet n'a pas pu être converti en chaîne.

Pour obtenir les valeurs de DOMElement, vous pouvez lire leur nodeValue ou textContent.

Quelques exemples DOM par moi: https://stackoverflow.com/search?q=user%3A208809+dom

Questions connexes