Вот код XML, с которым я работаю:
<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>
Затем я написал простой код для работы с 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; } ?>
Этот код работает хорошо, выводя все значения цены лимонада, как ожидалось. Теперь, когда я изменяю строку запроса, выбираю только элементы с атрибутом, установленным на определенное значение, например
// лимонад [поставщик = "матери"] / цена
или
// лимонад [ID = "1"] / цена
он не будет работать, никакого вывода вообще. Что я делаю не так?
Попробуй это:
//lemonade[@id="1"]/price
или
//lemonade[@supplier="mother"]/price
Без «@» он ищет дочерние элементы с этим именем вместо атрибутов.
Это касается только касательной, но когда вы используете XPath в документе, для которого вы знаете структуру, не используйте «// some-element-name». Это очень удобно для быстрого примера, но когда вы попадаете в огромный XML-файл с этим запросом, особенно если за ним следует что-то сложное, вы быстро столкнетесь с проблемами производительности.
инвентарь / пить / лимонад [@ поставщик = "мать"] / цена
вы должны использовать знак @, чтобы указать атрибут в предикате, например: //lemonade[@supplier="mother"]/price
, вот и все.