Нередко возникает желание расширить информативность своего сайта за счет курсов валют, погоды и других информационных блоков. Предлагаем свой вариант решения — узконаправленный на импорт XML с сайта ЗАО «Агропромбанк».

Нам заранее известен источник данных и его структур — поэтому мы не будем биться над универсализацией парсера в сторону его упрощения.

На сайте банка есть примеры кода для парсинга данных курсов валют. Однако я считаю, что мой код проще в понимании и реализации. Также мы добавим кусочек с кеширование, дабы не дергать каждый раз при выхове скрипта удаленный сервер для получения данных. Я закешировал конечный результат.

Код парсера на PHP выглядит следующим образом:

//задаем путь к файлу кеширования
$cache_file = "cache/currency_apb.cache";
//список название/флагов интересующих нас валют
$currency = array(
    'USD' => array('code' => 'USD', 'flag' => 'us.gif'), 
    'EUR' => array('code' => 'EUR', 'flag' => 'europeanunion.gif'), 
    'MDL' => array('code' => 'MDL', 'flag' => 'md.gif'),
    'UAH' => array('code' => 'UAH', 'flag' => 'ua.gif'),                
    'RUR' => array('code' => 'RUB', 'flag' => 'ru.gif')
);  
//если сохраненный кеш-файл создан раньше часа ночи текущего дня
if(mktime() >= mktime(1, 0, 0, date("m"), date("d"), date("Y")) && @filemtime($cache_file) < mktime(0, 0, 10, date("m"), date("d")-1, date("Y")))
{
    $xml = @simplexml_load_file('http://www.agroprombank.com/xmlinformer.php?date='.date('Y-m-d').'&type=commercial');
    //если разобран XML-файл
    if($xml)
    {
        //извлекаем дату, на которую установлен курс
        $date = $xml->course['date'];
        //пробегаем по дереву валют
        foreach($xml->course->currency AS $course)
        {
            foreach($currency AS $key => $code)
                if($course['code'] == $code['code'])
                {
                    $currency[$key]['value'] = (string)$course->currencySell;
                    $currency[$key]['value1'] = (string)$course->currencyBuy;
                }
        }  
        //создаем новый контент - задаем шапку
        $content = '<table width="100%">';
        //генерим строки с курсами
        foreach($currency AS $key => $code)
            $content .= '<tr><td>'.$key.'</td> <td><img src="/images/flags/'.$code['flag'].'" alt="'.$key.'"></td><td>'.$code['value1'].'</td><td>'.$code['value'].'</td></tr>';    
        //задаем подвал
        $content .= '</table><div>По данным АПБ от '.$date.'</div>';  
        //удаляем старый кеш и записываем новый
        @unlink($cache_file);
        $fp = @fopen($cache_file, 'x');
        fwrite($fp, $content);
        fclose($fp); 
    }                
}
//извлекаем из кеша результат
$fp = @fopen($cache_file, 'r');  
$content = fread($fp, filesize($cache_file)); 
fclose($fp);
//выводим результат
echo $content;

Думаю, что комментариев в коде достаточно для понимания скрипта, поэтому дополнительных пояснений давать не буду. Если что — пишите в комментарии.

Опубликовать в Яндекс
Опубликовать в Facebook
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в LiveJournal
Опубликовать в Google Plus
Опубликовать в Google Buzz