xml — проблемы с PHP xpath — & gt; item (0) — & gt; nodeValue

Основываясь на следующем XML, я хочу получить название продукта и изображение определенного узла (ID)

<?xml version="1.0" encoding="utf-8"?>
<clients>
<client id="A">
<product>Name of product A</product>
<image>Product image name A</image>
</client>
<client id="B">
<product>Name of product B</product>
<image>Product image name B</image>
</client>
</clients>

Это код PHP:

$doc      = DOMDocument::load('clients.xml');
$xpath    = new DOMXPath($doc);
$query    = '//client[@id="A"]';
$info = $xpath->query($query);

Если я сделаю $ info-> item (0) -> nodeValue, я получу информацию одновременно, а не по отдельности:

Name of product A
Product image name A

Но я хочу получить -> product-> nodeValue и image-> nodeValue на основе идентификатора клиента.
Как я могу это сделать? Например, выполнение $ info-> item (0) -> product-> nodeValue не работает.

-> item (0) -> nodeValue дает все внутри этого конкретного элемента (в данном случае 0)

0

Решение

Вы используете XPath для извлечения узлов. Результатом пути расположения XPath является список узлов. -> item (0) возвращает первый узел в этом списке. client элемент узла.

Вызов DOMElement: $ nodeValue всегда возвращает все нисходящие текстовые узлы в виде строки. В вашем случае текстовые узлы внутри product и image узлы элементов.

У вас будет возможность извлечь дочерние узлы, если вы хотите получить значения отдельно.

$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXpath($dom);

foreach ($xpath->evaluate('//client[@id="A"]/*[self::product or self::image]') as $child) {
echo $child->localName, ': ', $child->nodeValue, "\n";
}

Выход:

product: Name of product A
image: Product image name A
1

Другие решения

Ваш результат возвращает один узел (клиент). Значение узла этого узла — весь текст под ним.

Пытаться:
«// client [@ id = ‘A’] / * [name () = ‘product’ or name () = ‘image’]» вернет два узла. Не забудьте проверить имя, если вы хотите использовать их по позиции.

0

По вопросам рекламы [email protected]