PHP:从Cube XML格式解析数据

时间:2015-01-13 10:57:02

标签: php xml parsing

我无法在官方文档中找到解决方案,所以这是我的方案:

我需要解析这个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怎么申报!那可能只是一个sintax问题......

更新

我几乎在那里:

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并返回Invalid argument supplied for foreach()。如果我使用单个索引而不是变量(例如01),它将起作用。所以现在的问题是如何动态增加索引! :(

1 个答案:

答案 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>