Merkez bankasından günlük döviz kurlarını indirmek?

Merhabalar,

Malumunuz üzere Merkez bankası bir XML dosya yayınlayarak tüm döviz kurlarını ve oranları veriyor. C# ve PHP ile bunu yapan bir sürü örnek var ama bana Qt/C++ ile bir örneği gerekti ve bulamadım. Bari ben yazayım dedim. 🙂

Qt ile öncelikle bir form oluşturuyoruz. Form üzerine bir düğme koyarak bu düğmeye tıklandığında http://www.tcmb.gov.tr/kurlar/today.xml adresinden XML dosyayı indirip istediğimiz kurların çekilmesini sağlayacağız. Bana sadece USD ve EUR gerektiği için ben bunları sorguladım. Elbette size tamamı gerekecekse sizlerin kısıtı kaldırmanız gerekir ki çok da zorlanacağınızı sanmıyorum.

void DovizKurlari::on_pBKurOku_clicked()
{

    ui->dETarih->setDate(QDate::currentDate());

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(fileIsReady(QNetworkReply*)) );
    manager->get(QNetworkRequest(QUrl("https://www.tcmb.gov.tr/kurlar/today.xml")));

}

Burada öncelikle dosyayı indireceğiz. İndirmek için de yukarıdaki kodu kullanıyoruz. Ama öncelikle pro dosyasına;

QT += network xml

eklemeyi unutmayın. Daha sonra da .h dosyasına gerekli kütüphaneleri ekliyoruz.

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

Yukarıdaki kodda dosya indikten sonra tetiklenecek fileIsReady fonksiyonu da aşağıda:

void DovizKurlari::fileIsReady(QNetworkReply *reply)
{
    QFile file;
    file.setFileName(QDir::tempPath() + "/today.xml");


    if(file.open(QIODevice::ReadWrite))
    {
        file.write(reply->readAll());
        file.close();
    } else
    {
        QMessageBox::critical(this,
                              "XML Okuma Hatası!!",
                              "XML Dosya açılamadı!",
                              QMessageBox::Ok);
        return;
    }

    reply->deleteLater();

    parseXML();


}

Ne yazık ki win üzerinde kullanıyoruz programı. Malum fabrika şartları. Dosyayı temp dizini kaydediyorum. Daha sora aşağıdaki fonksiyon ile de diske yazılan bu dosyayı parçalıyoruz:

void DovizKurlari::parseXML()
{
    /* We'll parse the example.xml */
       QFile* file = new QFile(QDir::tempPath() + "/today.xml");
       /* If we can't open it, let's show an error message. */
       if (!file->open(QIODevice::ReadOnly | QIODevice::Text))
       {
           QMessageBox::critical(this,
                                 "QXSRExample::parseXML",
                                 "Couldn't open example.xml",
                                 QMessageBox::Ok);
           return;
       }

       QXmlStreamReader reader(file);

       if (reader.readNextStartElement()) {
               if (reader.name() == "Tarih_Date"){
                   while(reader.readNextStartElement()){
                       if(reader.name() == "Currency"){

                           foreach(const QXmlStreamAttribute &attr, reader.attributes())
                           {
                               if (attr.name().toString() == "Kod")
                               {
                                   if(attr.value().toString()=="USD" || attr.value().toString()=="EUR")

                                 {
                                       //qDebug()<<"Kur: "<<attr.value().toString();

                                       while(reader.readNextStartElement()){
                                           if(reader.name() == "ForexBuying")
                                           {
                                               if(attr.value().toString() == "USD") ui->lEUSD->setText(reader.readElementText());
                                               else if(attr.value().toString() == "EUR") ui->lEEUR->setText(reader.readElementText());
                                           }
                                           else
                                               reader.skipCurrentElement();
                                       } //while

                                   }else reader.skipCurrentElement();
                               }
                           }
                           //qDebug()<<"Currency:"<<"-";
                       }
                       else
                           reader.skipCurrentElement();
                   }
               }
               else
               {
                   reader.raiseError("Hatalı dosya");
                   QMessageBox::critical(this,
                                         "Hata!",
                                         "TCMB Kurları okumnamadı! İnternet bağlantı hatası veya farklı dosya biçimi!",
                                         QMessageBox::Ok);
                   return;
               }
       }

       QMessageBox::information(this,
                             "TCMB Kur Okuma",
                             "TCMB Kurları okuma işlemi tamamlanmıştır. ",
                             QMessageBox::Ok);


}

Dikkat ederseniz ben sadece değerleri debug ekranına yazdırdım. Elbette bundan sonra siz dilediğiniz şeyi yapabilirsiniz. Ben PostgreSQL veritabanına Kurlar isimli bir tablo oluşturup bu değerleri oraya yazacağım. Sizler kendi ihtiyacınıza göre düzenlersiniz.
Umarım faydası olur… 🙂

Qt ile ilgili faydalandığım sayfalar aşağıda:

https://www.walletfox.com/course/qxmlstreamreaderexample.php
http://qt.shoutwiki.com/wiki/QXmlStreamReader_to_parse_XML_in_Qt

Kolay gelsin,
Mucip:)

Bu yazı Programlama kategorisine gönderilmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kodu girin... *