Проблемы с PHP xpath -> item (0) -> nodeValue

0

На основе следующего 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-> элемент (0) → product-> nodeValue не работает.

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

Теги:
xpath
xmlnode

2 ответа

1

Вы используете 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
0

Результат возвращает один узел (клиент). Узел узла этого узла - это весь текст под ним.

Попробуйте://клиент [@id = 'A']/* [name() = 'product' или name() = 'image'] "вернет два узла. Не забудьте проверить имя, если вы хотите использовать их по положению.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню