Strawberry
Strawberry

Reputation: 67868

What am I doing wrong with xpath?

test.html

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

PHP file

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

I am trying to use xPath to find the spans and then echo it, but it seems I cannot echo it. I tried dumping it to see if is evaluating properly, and I am not sure what does this output mean:

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

What does the #4 and #7 mean and what does the parenthesis mean; What is does the syntax mean?

Update: This is the error I get when I try to echo $retrieve_data; and $retrieve_data->item(1);

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

Upvotes: 5

Views: 509

Answers (4)

Gordon
Gordon

Reputation: 316969

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

returns a typed result if possible or a DOMNodeList containing all nodes matching the given XPath expression. In your case, it returns a DOMNodeList, because your XPath evaluates to four DOMElements, which are specialized DOMNodes. Understanding the Node concept when working with any XML, regardless in what language, is crucial.

echo $retrieve_data->item(1);

cannot work, because DOMNodeList::item returns a DOMNode and more specifically a DOMElement in your case. You cannot echo objects of any kind in PHP, if they do not implement the __toString() method. DOMElement doesnt. Neither does DOMNodeList. Consequently, you get the fatal error that the object could not be converted to string.

To get the DOMElement's values, you either read their nodeValue or textContent.

Some DOM examples by me: https://stackoverflow.com/search?q=user%3A208809+dom

Upvotes: 3

Decent Dabbler
Decent Dabbler

Reputation: 22783

If you want to output the XML (or HTML rather), try:

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

BTW, the DOMNodeList, that is the result of your query, is zero base indexed, so the first item would be 0. But perhaps you knew this already.

Upvotes: 1

Shcheklein
Shcheklein

Reputation: 6284

If you want to output text inside span you can use textContent property:

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

Upvotes: 2

VdesmedT
VdesmedT

Reputation: 9113

your item is as DOMNode object, echo its nodeValue property might helps

Upvotes: 1

Related Questions