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.

1

3 Answers 3

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; 
Sign up to request clarification or add additional context in comments.

4 Comments

This is how I was trying originally. thanks for the info.
This is a lot more elegant than just looping and should be the excepted answer.
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/…
Shouldn't "name" in 'name[@id="minwage"]' be "poster"? Since the element is a "poster" element?
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']; } } 

1 Comment

That worked like a charm. I was def over thinking the process. +1
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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.