Вот 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;
}
?>
Этот код работает хорошо, выводя все значения цены лимонада, как и ожидалось. Теперь, когда я изменяю строку запроса, чтобы выбрать только элементы с атрибутом, установленным на определенное значение, например
//lemonade[supplier = "mother"]/price
или же
//lemonade[id = "1"]/price
это не сработает, выхода нет вообще. Что я делаю не так?






Попробуй это:
//lemonade[@id = "1"]/price
или же
//lemonade[@supplier = "mother"]/price
Без «@» он ищет дочерние элементы с таким именем вместо атрибутов.
вы должны использовать знак @, чтобы указать атрибут в предикате, например: //lemonade[@supplier = "mother"]/price, вот и все.
Это связано только косвенно, но когда вы используете XPath для документа, структура которого вам известна, не использует «// имя-элемента». Это очень хорошо для быстрого примера, но когда вы обращаетесь к огромному XML-файлу с этим запросом, особенно если за ним следует что-то сложное, вы быстро столкнетесь с проблемами производительности.
инвентарь / напиток / лимонад [@ supplier = "mother"] / цена