【问题标题】:Xpath for a REST response with Keys带有键的 REST 响应的 Xpath
【发布时间】:2011-12-30 14:13:10
【问题描述】:

我正在尝试使用 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>

【问题讨论】:

  • 请向我们展示您的 xml。
  • 嗨 Rob,刚刚将 XML 添加到用户值所在的位置,干杯。

标签: php xml rest xpath simplexml


【解决方案1】:

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

【讨论】:

  • 英雄!在我的论文中明确提到你!非常感谢
  • Lol 会在 7 月发布!我会做笔记
【解决方案2】:

我不确定 simpleXml 是否可以评估此​​表达式,但任何兼容的 XPath 实现都会:

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

计算此表达式时,结果是 Value 元素的字符串值,该元素是具有 name 属性的 KEY 元素的子元素(文档顺序中的第一个),其字符串值为 @ 987654325@.

另外,如果 XML 文档的结构是已知的,那么不使用// 可能会更高效(快速):

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

【讨论】:

  • 感谢 Dimitre 的解释,为了提高效率,肯定会使用您建议的正确路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
相关资源
最近更新 更多