6

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.

Denoteone
  • 4,043
  • 21
  • 96
  • 150
  • As you asked for resources, yes there is: [Implementing condition in XPath](http://stackoverflow.com/questions/3448005/implementing-condition-in-xpath) and [SimpleXML get element content based on attribute value](http://stackoverflow.com/q/4736417/367456) – hakre Jul 08 '13 at 19:44

3 Answers3

30

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;
Martin Schneider
  • 14,263
  • 7
  • 55
  • 58
kingcoyote
  • 1,145
  • 8
  • 21
  • This is how I was trying originally. thanks for the info. – Denoteone Mar 14 '12 at 06:45
  • 1
    This is a lot more elegant than just looping and should be the excepted answer. – Select0r Nov 11 '15 at 10:34
  • I've been trying to make this code work, by duplicating the code on my localhost, yet I get "Undefined Offset: 0" Please see: https://stackoverflow.com/questions/48154956/xpath-query-on-simplexml-document-undefined-offset-0 – buck1112 Jan 08 '18 at 17:15
  • 4
    Shouldn't "name" in 'name[@id="minwage"]' be "poster"? Since the element is a "poster" element? – Jordan Mar 16 '18 at 20:20
8

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'];
    }
}
Werner
  • 3,523
  • 1
  • 22
  • 21
2

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.

Sven
  • 1,450
  • 3
  • 33
  • 58
Duke
  • 35,420
  • 13
  • 53
  • 70