Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I use SimpleXML & Xpath to directly select an Elements Attribute?

i.e. - i want to return a string "yellow" using something like xpath expression "//banana/@color" and the following example xml...

<fruits>
 <kiwi color="green" texture="hairy"/>
 <banana color="yellow" texture="waxy"/>
</fruits>


$fruits = simplexml_load_string(
'<fruits>
 <kiwi color="green" texture="hairy"/>
 <banana color="yellow" texture="waxy"/>
</fruits>');

print_r($fruits->xpath('//banana/@color'));

produces

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [color] => yellow
                )

        )

)

whereas i would prefer something like...

Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => yellow
        )

)

...so that i don't need to write a special case into the application i'm writing.

thanks very much! :)

like image 688
significance Avatar asked Oct 28 '10 17:10

significance


People also ask

What is SimpleXML extension?

SimpleXML is a PHP extension that allows users to easily manipulate/use XML data. It was introduced in PHP 5 as an object oriented approach to the XML DOM providing an object that can be processed with normal property selectors and array iterators.


1 Answers

I just gave your test a shot because i was curious and I found that it does actually produce the string value yellow when converted to string.

$fruits = simplexml_load_string(
'<fruits>
 <kiwi color="green" texture="hairy"/>
 <banana color="yellow" texture="waxy"/>
</fruits>');

$found = $fruits->xpath('//banana/@color');
echo $found[0];

It would seem this is just how SimpleXmlElement attribute nodes are represented. So you can use this as (string) $found[0] if you are not printing/echoing it directly.

Of course if your depending on the value remaining a SimpleXMLElement then that could be an issue I suppose. But i would think just remembering to cast as string when you go to use the node later would still be doable.

IF you really need a detailed interface for Nodes that supports an Attribute as a node then you may want to just switch to DOMDocument. You code will get more verbose, but the implementation is more clear.

like image 51
prodigitalson Avatar answered Sep 19 '22 10:09

prodigitalson