Xpath для ответа REST с ключами - PullRequest
2 голосов
/ 30 декабря 2011

Я пытаюсь использовать Xpath для поиска значения имени пользователя из ответа REST. Когда я использую

$data = new simpleXMLElement($response->getBody());
$matches = $data->xpath('//KEY[@name="username"]');

Я получаю

array(1) {
[0]=>
object(SimpleXMLElement)#7 (2) {
["@attributes"]=>
array(1) {
["name"]=>
string(8) "username"
}
["VALUE"]=>
string(5) "guest"
}
}

У меня вопрос: какое выражение Xpath позволяет получить только отображаемое значение? в этом примере это гость, но будет меняться в зависимости от пользователя.

Любые предложения с благодарностью.

Структура XML ниже.

<?xml version="1.0" encoding="UTF-8" ?> 
<RESPONSE>
<MULTIPLE>
<SINGLE>
<KEY name="id">
<VALUE>1</VALUE> 
</KEY>
<KEY name="username">
<VALUE>guest</VALUE> 
</KEY>
<KEY name="firstname">
<VALUE>Guest user</VALUE> 
</KEY>

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Невозможно с SimpleXML. Метод xpath всегда возвращает массив.

Но вы можете сделать:

$keys = simplexml_load_string($xml);
echo current($keys->xpath('//KEY[@name="username"]/VALUE'));

демо


Или используйте DOM. Следующее немедленно вернет строку:

$dom = new DOMDocument;
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);
echo $xpath->evaluate('string(//KEY[@name="username"]/VALUE)');

демо

0 голосов
/ 30 декабря 2011

Я не уверен, что simpleXml может оценить это выражение, но любая совместимая реализация XPath будет:

string(//KEY[@name="username"]/VALUE)

Когда это выражение вычисляется, результатом является строковое значение элемента Value, которыйдочерний элемент (первого в порядке документа) элемента KEY, который имеет атрибут name, строковое значение которого равно "username".

Кроме того, если структура документа XML известна, то онможет быть более эффективным (быстрым) не использовать //:

string(/RESPONSE/MULTIPLE/SINGLE/KEY[@name="username"]/VALUE)
...