【问题标题】:php xpath returns Array(0)php xpath 返回 Array(0)
【发布时间】:2018-09-17 19:59:05
【问题描述】:

我阅读了以下 XML: http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml

控制器:

$ECB_rates = array();
$currencies = explode(',', 'GBP,USD,RUB,AUD');
foreach($currencies as $currency) {
    $ECB_rates[$currency] = $ECB_XML->xpath('//Cube/Cube/Cube[@currency="' . $currency . '"]/@rate');
}
$this->set('ECB_rates', $ECB_rates);

查看:

var_dump($ECB_rates);

我得到以下信息:

array(4) { ["GBP"]=> array(0) { } ["USD"]=> array(0) { } ["RUB"]=> array(0) { } ["AUD"]=> array(0) { } } 

我不明白为什么汇率会以空数组的形式返回。

【问题讨论】:

  • 因为@rate@currency 在同一级别?
  • 是的。我关注了许多帖子,例如stackoverflow.com/questions/15158314/…,这就是他们显示您获得相同级别属性的方式。这不正确吗?

标签: php xpath simplexml


【解决方案1】:

文档有一个默认命名空间,如果没有正确完成,通常会混淆 XPath 表达式。另一部分是 xpath() 返回一个 SimpleXMLElements 数组,这也无助于您的事业。

以下代码首先使用前缀“def”注册默认命名空间,然后(我也简化了表达式)使用它作为前缀来查找具有所需货币的<Cube> 元素。然后它获取第一个结果(无论如何应该只有一个)并将其转换为字符串以使其更有用。

$ECB_XML->registerXPathNamespace("def", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
$ECB_rates = array();
$currencies = explode(',', 'GBP,USD,RUB,AUD');
foreach($currencies as $currency) {
    $ECB_rates[$currency] = (string)$ECB_XML->xpath('//def:Cube[@currency="' . $currency . '"]/@rate')[0];
}
var_dump($ECB_rates);

这给了...

array(4) {
  'GBP' =>
  string(7) "0.87295"
  'USD' =>
  string(6) "1.2234"
  'RUB' =>
  string(7) "70.8270"
  'AUD' =>
  string(6) "1.5934"
}

更新:

您可以(如果 XML 格式稳定)只使用 SimpleXML 元素/属性访问。检查货币是否在您之后的货币数组中......

foreach($ECB_XML->Cube->Cube->Cube as $rate) {
    $currency = (string)$rate["currency"];
    if ( in_array($currency, $currencies))   {
        $ECB_rates[$currency] = (string)$rate["rate"];
    }
}

这可能会以不同的顺序为您提供项目,但这可能不是问题。

【讨论】:

  • 我使用 simplexml_load_string 读取 xml,与 ECB 网站上的示例相同:ecb.europa.eu/stats/policy_and_exchange_rates/…。 simplexml_load_string 不负责命名空间吗?
  • 以下方法可以很好地列出所有节点:foreach($ECB_XML->Cube->Cube->Cube as $rate) { $ECB_rates[(string)$rate["currency"]] = $率[“率”]; }。但我只需要列出我列表中的那些。
  • 我添加了另一个示例。至于命名空间 - SimpleXML 确实考虑到了它,但这不一定适用于 XPath。
猜你喜欢
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2020-01-15
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多