Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

simpleXML get node child based on attribute [duplicate]

Tags:

php

xml

simplexml

I am trying to parse out the value of a node I am referencing by one of its attributes. but I am not sure of the syntax

XML:

<data>

  <poster name="E-Verify" id="everify">

    <full_image url="e-verify-swa-poster.jpg"/>

    <full_other url=""/>

  </poster>


  <poster name="Minimum Wage" id="minwage">

    <full_image url="minwage.jpg"/>

    <full_other url="spa_minwage.jpg"/>

  </poster>
</data>

here is where I want to get the url value of full_image where poster id equal to minwage:

$xml = simplexml_load_file('PosterData.xml');
$main_url = $xml->full_image[name] where poster[id] = "minwage";
//something like that.
echo $main_url;

Result: minwage.jpg

If anyone has any resources that cover this stuff please share.

like image 525
Denoteone Avatar asked Mar 14 '12 05:03

Denoteone


3 Answers

You should be able to use SimpleXMLElement::xpath() to run an xpath query on a simple XML document.

$xml = simplexml_load_file('PosterData.xml');
$main_url = $xml->xpath('name[@id="minwage"]/full_image')[0];

echo $main_url;
like image 180
kingcoyote Avatar answered Oct 10 '22 06:10

kingcoyote


Simply loop the poster elements and remember to cast the attribute values to strings, since you want to compare them (and probably output them) as strings:

$xml = simplexml_load_file('PosterData.xml');

foreach ($xml->poster as $poster) {
    if ((string) $poster['id'] == 'minwage') {
        echo (string) $poster->full_image['url'];
    }
}
like image 33
Werner Avatar answered Oct 10 '22 06:10

Werner


You can use:

$object = simplexml_load_string('<data><poster name="E-Verify" id="everify"><full_image url="e-verify-swa-poster.jpg"/><full_other url=""/></poster><poster name="Minimum Wage" id="minwage"><full_image url="minwage.jpg"/><full_other url="spa_minwage.jpg"/></poster></data>');

foreach ($object as $value) {
    echo "URL: ".$value->full_image->attributes();
    echo "<br>";
}

Either use simplexml_load_file('Some external file.xml') if calling external file.

like image 25
Rinto George Avatar answered Oct 10 '22 05:10

Rinto George