Ответ 1
Попробуйте следующее:
//lemonade[@id="1"]/price
или
//lemonade[@supplier="mother"]/price
Без "@" он ищет дочерние элементы с этим именем вместо атрибутов.
Вот код 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
, все.