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 № 1Niemoż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"));
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)");
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)