ahmed
ahmed

Reputation: 14666

How to view DOMNodeList object's data in php

when I want to test php array I use the following code

    print_r($myarray);

but know I want to see the data of an object my object is

    $xpath = new DOMXPath($doc);
    $myobject = $xpath->query('//*[ancestor-or-self::a]');

when I use

    print_r($myobject);

I get that output

    DOMNodeList Object ( )

I want to iterate through the values of this object to test the result of my query?

Upvotes: 14

Views: 36117

Answers (10)

azhar uddin
azhar uddin

Reputation: 26

its a example of xml file that's load by xpath

my xml file name is 'test.xml'

<college>
    <student>
        <firstName>Azhar Uddin</firstName>
        <lastName>Raihan</lastName>
        <mobile>018*******</mobile>
        <fatherName>alam uddin</fatherName>
        <address>
            <presentAddress title="notun" type="multiple">
                <zila>Feni</zila>
                <upzila>chhagalniya</upzila>
                <post>3912</post>
            </presentAddress>
            <permanentAddress>
                <zila>comilla</zila>
                <upzila>sadar</upzila>
            </permanentAddress>
        </address>
    </student>
</college>

now load it

$sxe=simplexml_load_file('test.xml');
$address = $sxe->xpath("student/address/presentAddress");

foreach($address as $addr)
{
    foreach($addr as $key=>$val)
    {
        echo $key."=".$val,"<br>";
    }
}

Upvotes: 0

Kuko Kukanovic
Kuko Kukanovic

Reputation: 141

A bit late in the game, but perhaps it helps someone...

Be aware of utf-8 output when using the dom/xpath object itself.

If you would output the nodeValue directly, you would get corrupted characters e.g.:

ìÂÂì ë¹Â디ì¤
ìì ë¹ë””ì¤ í°ì  íì¤

You have to load your dom object with the second param "utf-8", new \DomDocument('1.0', 'utf-8'), but still when you print the dom node list/element value you get broken characters:

echo $contentItem->item($index)->nodeValue

you have to wrap it up with utf8_decode:

echo utf8_decode($contentItem->item($index)->nodeValue) //output: 者不終朝而會,愚者可浹旬而學

Upvotes: 1

Danhdds
Danhdds

Reputation: 150

It's possible to navigate through the nodes by using a simple foreach as follow:

foreach ($myobject as $node) {

  echo $node->nodeValue, PHP_EOL;

} // end foreach 

Hope that it can help others, the important pieces of code are the

foreach 

and the item

$node->nodeValue

for more details regarding this class please visit:

http://php.net/manual/en/class.domnodelist.php

Upvotes: 6

madprogrammer
madprogrammer

Reputation: 7

After much debugging I found out that all DOM objects are invisible to var_dump() and print_r(), my guess is because they are C objects and not PHP objects. So I tried saveXML(), which works fine on DOMDocument, but is not implemented on DOMElement.

The solution is simple (if you know it):

$xml = $domElement->ownerDocument->saveXML($domElement);

Upvotes: -2

Greg Young
Greg Young

Reputation: 543

For some reason, I've been unable to get the saveHTML/saveXML methods to work. So I wrote my own recursive routine which works for me:

function pvIndent ( $ind ) {
    for ($i=0;$i<$ind;$i++)
        print ( "   " );
}

function pvPrint_r ( $val ) {
    echo '<pre>';
    print_r ( $val );
    echo '</pre>';
}

function pvDOMNodeListPrint_r_ ( $ind,$DOMNodeList ) {
    for ($item=0;$item<$DOMNodeList->length;$item++) {
        $DOMNode = $DOMNodeList->item($item);
        if ($DOMNode->nodeName != "#text") {
            pvIndent ( $ind );
            print $DOMNode->nodeName;
            if ($DOMNode->nodeValue)
                print " = " . trim($DOMNode->nodeValue);
            print "\n";
            if ($DOMNode->attributes)
                for ($attr=0;$attr<$DOMNode->attributes->length;$attr++) {
                    $DOMNodeAttr = $DOMNode->attributes->item($attr);
                    pvIndent ( $ind+1 );
                    print "@" . $DOMNodeAttr->nodeName . " = " . trim($DOMNodeAttr->nodeValue) . "\n";
                }
            if ($DOMNode->childNodes)
                pvDOMNodeListPrint_r_ ( $ind+1,$DOMNode->childNodes );
        }
    }
}

function pvDOMNodeListPrint_r ( $DOMNodeList ) {
    echo '<pre>';
    pvDOMNodeListPrint_r_ ( 0,$DOMNodeList );
    echo '</pre>';
}

Call pvDOMNodeListPrint_r with your result from a query on an XDOMPath object.

Notes :

pv is just the prefix I use to avoid name space pollution - feel free to edit it out.

pre tags are used so white space and newlines are handle properly for formatting when output in the body of your html, which is where I generally need such debugging statements - you can format to your taste.

I've explicitly skipped DOMNode's with the name "#text" as these seem to repeat the text already contained in the parent node. I'm not sure this correct for all valid XDOMPath's loaded with HTML, but I've not yet seen an exception - you can always eliminate the exclusion if you don't mind the usual redundancy.

Upvotes: 1

Steven Vachon
Steven Vachon

Reputation: 3990

Someone wrote a great getArray() function: http://www.php.net/manual/en/class.domdocument.php#101014

Upvotes: 2

ghbarratt
ghbarratt

Reputation: 11711

DOMNodeList is an interesting object, one that you will not get much information from using print_r or var_dump.

There are many ways to view the data of a DOMNodeList object. Here is an example:

$xpath = new DOMXpath($dom);
$dom_node_list = $xpath->query($your_xpath_query);
$temp_dom = new DOMDocument();
foreach($dom_node_list as $n) $temp_dom->appendChild($temp_dom->importNode($n,true));
print_r($temp_dom->saveHTML());

(Of course use saveXML instead of saveHTML if you are dealing with XML.)

A DOMNodeList can be iterated over like an array. If you want to pull the data out of the DOMNodeList object and put it into a different data structure, such as an array or stdClass object, then you simply iterate through the "nodes" in the DOMNodeList, converting the nodes' values and/or attributes (that you want to have available) before adding them to the new data structure.

Upvotes: 26

Ryan
Ryan

Reputation: 778

var_dump($myobject); may be what you're looking for

Upvotes: 0

Scott Lundberg
Scott Lundberg

Reputation: 445

How about a recursive function?

Function XMLPrint_r($d_DomNode) {
    print $d_DomNode->$nodeName." ".$d_DomNode->$nodeValue."<br>";
    Foreach($d_DomNode->$childNodes as $d_ChildNode) {
        print " ";
        XMLPrint_r($d_ChildNode);
    }
}

I did not test this, but you get the idea.

Upvotes: 1

zombat
zombat

Reputation: 94227

Your xpath query is not matching anything in your XML.

From the DomXPath::query manual page:

Returns a DOMNodeList containing all nodes matching the given XPath expression . Any expression which do not return nodes will return an empty DOMNodeList.

Upvotes: 1

Related Questions