/ / Xpath dla odpowiedzi REST z kluczami - php, xml, rest, xpath, simplexml

Xpath dla odpowiedzi REST za pomocą Keys - php, xml, rest, xpath, simplexml

Próbuję użyć Xpath, aby znaleźć wartość nazwy użytkownika z odpowiedzi REST. Kiedy używam

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

dostaję

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

Moje pytanie brzmi: jakie jest wyrażenie Xpath, aby uzyskać tylko wartość do wyświetlenia? w tym przykładzie jest gościem, ale zmieni się w zależności od użytkownika.

Wszelkie sugestie są bardzo doceniane.

Struktura XML poniżej.

<?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>

Odpowiedzi:

2 dla odpowiedzi № 1

Niemożliwe z SimpleXML. The xpath Metoda zawsze zwróci tablicę.

Ale możesz zrobić:

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

próbny


Lub użyj DOM. Następujące natychmiast zwróci ciąg:

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

próbny


0 dla odpowiedzi nr 2

Nie jestem pewien, czy simpleXml może ocenić to wyrażenie, ale każda zgodna implementacja XPath będzie:

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

Gdy to wyrażenie jest oceniane, wynikiem jest wartość ciągu znaków Value element będący dzieckiem (pierwszy w kolejności dokumentu) KEY element, który ma name atrybut, którego wartością ciągu jest "username".

Ponadto, jeśli struktura dokumentu XML jest znana, może być bardziej wydajne (szybkie), aby nie używać //:

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