XPath query with PHP
Solution 1
Try this:
//lemonade[@id="1"]/price
or
//lemonade[@supplier="mother"]/price
Without the "@" it looks for child elements with that name instead of attributes.
Solution 2
This is only tangentially related, but when you use XPath on a document for which you know the structure, don't use "//some-element-name". It's very nice for a quick example, but when you hit a huge xml file with that query, particularly if it is followed by something complex, you will quickly run into performance issues.
inventory/drink/lemonade[@supplier="mother"]/price
Solution 3
you have to use the @ sign to indicate attribute within the predicate like so: //lemonade[@supplier="mother"]/price
, that's all.
liewl
Updated on July 09, 2022Comments
-
liewl almost 2 years
Here's the XML code I'm working with:
<inventory> <drink> <lemonade supplier="mother" id="1"> <price>$2.50</price> <amount>20</amount> </lemonade> <lemonade supplier="mike" id="4"> <price>$3.00</price> <amount>20</amount> </lemonade> <pop supplier="store" id="2"> <price>$1.50</price> <amount>10</amount> </pop> </drink> </inventory>
Then I wrote a simple code to practice working with XPath:
<?php $xmldoc = new DOMDocument(); $xmldoc->load('sample.xml'); $xpathvar = new Domxpath($xmldoc); $queryResult = $xpathvar->query('//lemonade/price'); foreach($queryResult as $result) { echo $result->textContent; } ?>
That code is working well, outputting all the lemonade price values as expected. Now when i change the query string to select only the elements with an attribute set to a certain value, like
//lemonade[supplier="mother"]/price
or
//lemonade[id="1"]/price
it won't work, no output at all. What am i doing wrong?