php xpath返回Array(0)

时间:2018-04-08 07:51:05

标签: php xpath simplexml

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

我无法弄清楚为什么费率会以空数组的形式返回。

1 个答案:

答案 0 :(得分:0)

该文档具有默认命名空间,如果操作不正确,通常会混淆XPath表达式。另一部分是xpath()返回一个SimpleXMLElements数组,这对你的事业也没有帮助。

以下代码首先使用前缀&#39; def&#39;注册默认命名空间。然后(我也简化了表达式)使用它作为前缀来查找具有所需货币的<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"];
    }
}

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