2011-12-30 41 views
2

我试图使用Xpath从REST响应中查找用户名值。当我使用使用键的REST响应的Xpath

$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> 
+1

告诉我们你的XML请。 – 2011-12-30 14:14:30

+0

Hi Rob,刚刚将XML添加到用户值的位置,欢呼。 – 2011-12-30 14:35:09

回答

2

SimpleXML不可能。 xpath方法将始终返回一个数组。

但你可以这么做:

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

demo


或者使用DOM。下面将立即返回字符串:

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

demo

+0

英雄!在我的论文中明确提到你!非常感谢 – 2011-12-30 14:58:04

+0

Lol将在七月份发布时发布!我会做笔记 – 2011-12-30 15:16:21

0

我不知道的SimpleXML可以评估这个表达式,但任何符合XPath实现将:

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

当这个表达式求值,结果是Value元素的字符串值,该元素是(文档顺序中的第一个)子元素KEY具有name属性的元素,其字符串值为"username"

此外,如果XML文档的结构是已知的,那么它可能是更有效的(快)不使用//

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

感谢Dimitre的解释,为了提高效率,一定会使用正确的路径。 – 2011-12-30 15:20:56