simpleXML get node child based on attribute

19,633

Solution 1

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'];
    }
}

Solution 2

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;

Solution 3

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.

Share:
19,633

Related videos on Youtube

Denoteone
Author by

Denoteone

I have 12 years of professional experience efficiently coding websites, web applications, and CMS plugins using current web technologies like PHP, Angular 2, and CSS(3) to list a few examples. Building state-of-the-art, easy to use, user-friendly websites and applications that have valid and efficient code is truly a passion of mine In addition to my knowledge base, I actively seek out new technologies and stay up-to-date on industry trends and advancements. Denoteone @ Miaou

Updated on June 04, 2022

Comments

  • Denoteone
    Denoteone almost 2 years

    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
    Denoteone about 12 years
    That worked like a charm. I was def over thinking the process. +1
  • Denoteone
    Denoteone about 12 years
    This is how I was trying originally. thanks for the info.
  • Select0r
    Select0r over 8 years
    This is a lot more elegant than just looping and should be the excepted answer.
  • buck1112
    buck1112 over 6 years
    I've been trying to make this code work, by duplicating the code on my localhost, yet I get "Undefined Offset: 0" Please see: stackoverflow.com/questions/48154956/…
  • Jordan
    Jordan about 6 years
    Shouldn't "name" in 'name[@id="minwage"]' be "poster"? Since the element is a "poster" element?