我读了以下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) { } }
我无法弄清楚为什么费率会以空数组的形式返回。
答案 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"];
}
}
这可能会以不同的顺序为您提供项目,但这可能不是问题。