You can find an XML node by value in PHP, in the following ways:
Loop Over Nodes and Find a Match
You can simply loop over the XML nodes till you find a match. For example, let's suppose you have the following XML of customers:
$xmlStr =<<<XML <?xml version="1.0"?> <customers> <customer> <name>John Doe</name> <age>24</age> </customer> <customer> <name>Jane Doe</name> <age>29</age> </customer> <customer> <name>Bruce Wayne</name> <age>39</age> </customer> </customers> XML;
To find a customer by the name
"Jane Doe
", you would do the following:
$xml = new SimpleXMLElement($xmlStr); foreach ($xml->customer as $customer) { if ((string) $customer->name === 'Jane Doe') { // do something... } }
Similarly, you can also do look-up for partially matching values, for example, by using str_contains()
:
$xml = new SimpleXMLElement($xmlStr); foreach ($xml->customer as $customer) { if (str_contains((string) $customer->name, 'Doe')) { // do something... } }
Use XPath
You can also make use of xpath to directly select a specific node by value. For example, let's suppose you have the following XML of customers:
$xmlStr =<<<XML <?xml version="1.0"?> <customers> <customer> <name>John Doe</name> <age>24</age> </customer> <customer> <name>Jane Doe</name> <age>29</age> </customer> <customer> <name>Bruce Wayne</name> <age>39</age> </customer> </customers> XML;
To find a customer by the name
"Jane Doe
", you would do the following:
$xml = new SimpleXMLElement($xmlStr); // select node by value and return its parent node $node = $xml->xpath('//customers/customer/name[text()="Jane Doe"]/parent::*'); var_dump($node); /* output: array(1) { [0]=> object(SimpleXMLElement)#2 (2) { ["name"]=> string(8) "Jane Doe" ["age"]=> string(2) "29" } } */
Similarly, you can also do look-up for partially matching values using the xpath contains()
function, for example, like so:
$xml = new SimpleXMLElement($xmlStr); // select node by value and return its parent node $node = $xml->xpath('//customers/customer/name[contains(text(), "Doe")]/parent::*'); var_dump($node); /* output: array(2) { [0]=> object(SimpleXMLElement)#2 (2) { ["name"]=> string(8) "John Doe" ["age"]=> string(2) "24" } [1]=> object(SimpleXMLElement)#3 (2) { ["name"]=> string(8) "Jane Doe" ["age"]=> string(2) "29" } } */
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.