37

In an XML document, I have elements which share the same name, but the value of an attribute defines what type of data it is, and I want to select all of those elements which have a certain value from the document. Do I need to use XPath (and if so, could you suggest the right syntax) or is there a more elegant solution?

Here's some example XML:

<object> <data type="me">myname</data> <data type="you">yourname</data> <data type="me">myothername</data> </object> 

And I want to select the contents of all <data> tags children of <object> who's type is me.

PS - I'm trying to interface with the Netflix API using PHP - this shouldn't matter for my question, but if you want to suggest a good/better way to do so, I'm all ears.

1

2 Answers 2

56

Try this XPath:

/object/data[@type="me"] 

Which reads as:

  • Select (/) children of the current element called object
  • Select (/) their children called data
  • Filter ([...]) that list to elements where ...
    • the attribute type (the @ means "attribute")
    • has the text value me

So:

$myDataObjects = $simplexml->xpath('/object/data[@type="me"]'); 

If object is not the root of your document, you might want to use //object/data[@type="me"] instead. The // means "find all descendents" rather than "find all children".

Sign up to request clarification or add additional context in comments.

1 Comment

Can this be done when the element has a default xmlns?
5

I just made a function to do this for me; it only grabs the first result though. Your mileage may vary.

function query_attribute($xmlNode, $attr_name, $attr_value) { foreach($xmlNode as $node) { if($node[$attr_name] == $attr_value) { return $node; } } } 

Usage:

echo query_attribute($MySimpleXmlNode->Customer, "type", "human")->Name; 

(For the XML below)

<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root> 

2 Comments

Why not use the XPath Gumbo suggested? And why use a switch instead of the easier to read if($node[$attr_name] == $attr_value)?
This is a useful example to have, because sometimes you want to incorporate additional logic, so that XPath isn't the best approach.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.