PHP: 从 Cube XML 格式解析数据
PHP: parsing data from Cube XML format
我在官方文档上找不到解决方案,所以这是我的场景:
我需要从这个 xml 中解析数据:http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml
这是我到目前为止实现的代码:
$xml=simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml');
foreach($xml->Cube->Cube as $x) {
$arr[date('d-m',strtotime($x['time']))] = array();
foreach($xml->Cube->Cube->Cube as $y) {
$arr[(string)$y['currency']] = (float)$y['rate'];
};
};
问题是这段代码显然只会解析第一组汇率,而我需要解析为每个日期设置的每个汇率,然后我需要用我不知道的其他东西来改变 $xml->Cube->Cube->Cube
如何申报!那么可能只是一个语法问题...
更新
我快到了:
foreach($xml->Cube->Cube as $x) {
for ($i=0;$i<90;$i++) {
foreach($xml->Cube->Cube[$i]->Cube as $y) {
$arr[date('d-m',strtotime($x['time']))][(string)$y['currency']] = (float)$y['rate'];
}
}
}
问题出在第 3 行:foreach
不接受变量 $i
和 returns Invalid argument supplied for foreach()
。如果我使用单个索引而不是变量(例如 0
或 1
),它将起作用。所以现在的问题是如何动态增加索引! :(
好吧,使用命名空间有一个小技巧,但这就是代码:
<?php
$xml = simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml');
$xml->registerXPathNamespace('d', 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref');
$list = $xml->xpath('//d:Cube[@currency and @rate]');
?>
<!DOCTYPE html>
<html>
<head>
<title>xpath</title>
</head>
<body>
<table>
<tr>
<th>id</th>
<th>currency</th>
<th>rate</th>
</tr>
<?php $count = 0; ?>
<?php foreach ($list as $cube): ?>
<?php $attrs = $cube->attributes(); ?>
<tr>
<td><?php echo ++$count; ?></td>
<td><?php echo $attrs['currency']; ?></td>
<td><?php echo $attrs['rate']; ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
我在官方文档上找不到解决方案,所以这是我的场景:
我需要从这个 xml 中解析数据:http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml
这是我到目前为止实现的代码:
$xml=simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml');
foreach($xml->Cube->Cube as $x) {
$arr[date('d-m',strtotime($x['time']))] = array();
foreach($xml->Cube->Cube->Cube as $y) {
$arr[(string)$y['currency']] = (float)$y['rate'];
};
};
问题是这段代码显然只会解析第一组汇率,而我需要解析为每个日期设置的每个汇率,然后我需要用我不知道的其他东西来改变 $xml->Cube->Cube->Cube
如何申报!那么可能只是一个语法问题...
更新
我快到了:
foreach($xml->Cube->Cube as $x) {
for ($i=0;$i<90;$i++) {
foreach($xml->Cube->Cube[$i]->Cube as $y) {
$arr[date('d-m',strtotime($x['time']))][(string)$y['currency']] = (float)$y['rate'];
}
}
}
问题出在第 3 行:foreach
不接受变量 $i
和 returns Invalid argument supplied for foreach()
。如果我使用单个索引而不是变量(例如 0
或 1
),它将起作用。所以现在的问题是如何动态增加索引! :(
好吧,使用命名空间有一个小技巧,但这就是代码:
<?php
$xml = simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml');
$xml->registerXPathNamespace('d', 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref');
$list = $xml->xpath('//d:Cube[@currency and @rate]');
?>
<!DOCTYPE html>
<html>
<head>
<title>xpath</title>
</head>
<body>
<table>
<tr>
<th>id</th>
<th>currency</th>
<th>rate</th>
</tr>
<?php $count = 0; ?>
<?php foreach ($list as $cube): ?>
<?php $attrs = $cube->attributes(); ?>
<tr>
<td><?php echo ++$count; ?></td>
<td><?php echo $attrs['currency']; ?></td>
<td><?php echo $attrs['rate']; ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>