php xpath returns 数组(0)

php xpath returns Array(0)

我阅读了以下内容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) { } } 

我不明白为什么返回的是空数组。

该文档有一个默认命名空间,如果操作不当,它通常会混淆 XPath 表达式。另一部分是 xpath() returns 一组简单的 XML 元素,这也无助于您的事业。

以下代码首先使用前缀 '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 格式稳定)只使用简单XML element/attribute 访问。检查货币是否在您之后的货币数组中...

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

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