views:

86

answers:

4

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
+1  A: 

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.

fireeyedboy
+1  A: 

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

VdesmedT
I have no idea what you juts said. What is its nodeValue? Like item(1)?
Doug
echo $retrieve_data->item(1)->nodeValue;
VdesmedT
+2  A: 

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

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

Shcheklein
I was trying echo `$retrieve_data->item(1);` earlier. Should that not echo the span html? Also, where can I find the documentation for the textContent part? I did not know you can do that.
Doug
Just like VdesmedT said below item(1) is not a string - it's Node object which may include a lot of stuff besides text and name. Base class for all nodes is described (with all available properties) here: http://www.php.net/manual/en/class.domnode.php
Shcheklein
+3  A: 
$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: http://stackoverflow.com/search?q=user%3A208809+dom

Gordon