Запрос XPath с PHP

Вот код 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" ]/цена

он не будет работать, никакого вывода вообще. Что я делаю неправильно?

Ответ 1

Попробуйте следующее:

//lemonade[@id="1"]/price

или

//lemonade[@supplier="mother"]/price

Без "@" он ищет дочерние элементы с этим именем вместо атрибутов.

Ответ 2

Это касается только касательной, но когда вы используете XPath в документе, для которого вы знаете структуру, не используйте "//some-element-name". Это очень удобно для быстрого примера, но когда вы попадаете в огромный XML файл с этим запросом, особенно если за ним следует что-то сложное, вы быстро столкнетесь с проблемами производительности.

инвентарь/пить/лимонад [@поставщик = "мать" ]/цена

Ответ 3

вам нужно использовать знак @, чтобы указать атрибут внутри предиката, например: //lemonade[@supplier="mother"]/price, все.