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"];
}
}
这可能会以不同的顺序为您提供项目,但这可能不是问题。
我阅读了以下内容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"];
}
}
这可能会以不同的顺序为您提供项目,但这可能不是问题。