MNB lekérdezés

Sziasztok,

Egy gyors SOAP lekérdezést szeretnénk csinálni MNB lekérdezésre:


$client = new SoapClient("http://www.mnb.hu/arfolyamok.asmx?WSDL");
$result = $client->GetCurrentExchangeRates();
$array = $result->GetCurrentExchangeRatesResult;

Sajnos az array nem az aminek látszik, hanem egy string(1378), hogy tudom ezt gyorsan feldolgozni Day = 2015.09.11, Rate->EUR = 315,34 ... formátumra vagy hasonlóra?

Tudom láma a kérdés, de nem programozó vagyok.

Hozzászólások

IMHO XML-t ad vissza, megnéztem egy kódomat ott ez áll:

$result = simplexml_load_string($result->GetExchangeRatesResult);

Ha nem vagy programozó, és választ kapsz egy programozótól, miért nem hiszed el neki, amit mond? Ha egy XML-t nem akként kezelsz, maximum a véletlen műve bármi eredmény. (Amiben az is közrejátszhat, hogy a böngészőben nem fogod látni az XML tag-eket, mert HTML-ként próbálja feldolgozni.)

--

Az általa megadott simplexml_load_string függvény értékét használtam volna után tömbnek, és ebből szedtem ki a Day->date értéket ügyesen, de ugyanezt nem tudom eljátszani a Rate->EUR-ra például.

A kód így néz ki most:


$client = new SoapClient("http://www.mnb.hu/arfolyamok.asmx?WSDL");
$result = $client->GetCurrentExchangeRates();
$result = simplexml_load_string($result->GetCurrentExchangeRatesResult);
$array = (array)$result;

echo $array['Day']['date'];

A Rate ami fejtörést okoz.

--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!

Most nemtom scrollozni nem tudsz, vagy copy-paste-elni? Irtam egy watchface-hez (Pebble TCW) arfolyamletoltot, a lenti kodot onnan masoltam ki. Honapok ota teljesen jol mukodik.
Objectet meg ne arraykent piszkalj, ott a SimpleXMLElement oldal, ezt adja vissza a simplexml_load_string, a doksi children es attributes resze korul nezelodj, ha mindenkepp ezt akarod hasznalni.

--
Hi, welcome to Fight Club.
First of all, how did you hear about us?

Kb. igy nyerem ki (hosszabb kodbol osszeollozva):


$objClient=new SoapClient("http://www.mnb.hu/arfolyamok.asmx?WSDL", array('trace' => true));
$currrates=$objClient->GetCurrentExchangeRates()->GetCurrentExchangeRatesResult;
$dom_root=new DOMDocument();
$dom_root->loadXML($currrates);
$xpath=new DOMXpath($dom_root);
...

ez meg igy nez ki:
  function extractRate(&$xpath,$name)
  {
    $elements=$xpath->query("//Rate[@curr='$name']//text()");
    
    foreach($elements as $element)
    {
      return $element->nodeValue;
    }
    return false;
  }

$akarmi=extractRate($xpath,$name); // $name="EUR" vagy ilyesmi formaban

szerk:
Az MNB minden hetkoznap egyszer frissiti az ertekeket, szoval nem a legfrissebb, de tobbe-kevesbe hivatalos. Ha kell, a datum is kinyerheto xpath-al a fenti xml-bol. Arra nincs kesz kodom, de //Day/@date jonak tunik.

--
Hi, welcome to Fight Club.
First of all, how did you hear about us?

Mivel a kisördög nem hagyott nyugodni ezért az alábbi megoldást eszeltem ki a te megoldásod segítségével:


$client = new SoapClient("http://www.mnb.hu/arfolyamok.asmx?WSDL");
$result = new SimpleXMLElement($client->GetCurrentExchangeRates()->GetCurrentExchangeRatesResult);

function extractRate($xml,$name)
{
    foreach ($xml->xpath("//Rate[@curr='$name']") as $item) { return $item; }
    return false;
}

$akarmi=extractRate($result,$name); // $name="EUR" vagy ilyesmi formaban

Ez mennyivel csúnyább megoldás a tiedhez képest?

--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!

Valoban nincs, a masik fuggvenyben tombbe tettem be az engem erdeklo arfolyamokat, aztan egyszerusitettem az xpath-ot meg a fuggvenyt, es ez maradt. Megoldhato listtel is pl. (az xpath mindenkepp tombot ad vissza).

--
Hi, welcome to Fight Club.
First of all, how did you hear about us?

Sziasztok!

Tudja valaki, hogy mi lehet az MNB webszervízzel? Ma délután az addig tökéletesen működő kód megszűnt normálisan működni.

A kód:

$client = new \SoapClient('http://www.mnb.hu/arfolyamok.asmx?WSDL');
$param = array('startDate' => date('Y-m-d'), 'endDate' => date('Y-m-d'), 'currencyNames' => 'USD,EUR');
$result = $client->__soapCall('GetExchangeRates', array('parameters' => $param));
$xml = new \SimpleXMLElement($result->GetExchangeRatesResult);

A hiba:
PHP Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in [....]

Előre is köszi minden infót!
exac

Az MNB-nél rontottak el valamit, nem megy. Az XML válasz helyett jön egy sima HTTP (404-et sem küldenek), miszerint az oldal nem létezik, menjek egyet vissza és kattintsak újra.

A WSDL-ben egy kicsit változtattak (HttpBasicBinding -> CustomBinding), de ez nem jelentős... csupán csak annyi, hogy nem implementáltak valamit.

Szóval a kódod ne bántsd, máshol sem megy... mi is várunk.

Nem nagyképűségből mondom, de "ezeknek ott" fogalmuk sincs a webservice-ek deploy-áról. WSDL-lel dolgonak, van egy nyúlfarknyi C# példakód, de... XML API-ra 404 helyett egy human-readable text/html mime-t visszaadni gyalázatos dolog. Ez egy állami PÉNZintézet! Az OTP-ben sem rontanak el egy tárolt eljárásban egy előjelet.

Nagyon gyakran felesleges kerdezgetni, minden hetkoznap egyszer modosul az arfolyam, szoval boven van lehetoseg tarolni. Azt nem tudom pontosan mikor frissul, de ki lehet tesztelni. Eddig nem tunt fel ilyesmi kieses a cache miatt, bar meg csak majus ota hasznalom aktivabban.

--
Hi, welcome to Fight Club.
First of all, how did you hear about us?

REST nem jó? Valamikor régen csináltam:

http://artinvoice.hu/api/EUR

és

http://artinvoice.hu/api/EUR/2011-01-04

A pénznem NAGYBETŰS, ISO kód, a dátum YYYY-MM-DD formátumú, ahogy a példákból is látszik. A tizedesjel magyar szabály szerinti. Az első példa a mindig aktuálisat mutatja, a második, dátummal paraméterezett értelemszerűen az adott dátumot.

--
Coding for fun. ;)

köszi a fórumfelvetést!
kedvet kaptam, s tegnap este csináltam egy python és egy php megoldást ezek alapján :-) php-ban lusta voltam dátumozni, így ott kézzel adtam meg :-). Fel is használtam a végeredményt (picit átalakítva azért, máshol ahol pont jól jött)

Python 2.7


from pysimplesoap.client import SoapClient
from BeautifulSoup import BeautifulSoup
import datetime

c = SoapClient(wsdl='http://www.mnb.hu/arfolyamok.asmx?WSDL')
enddate = datetime.datetime.now().date() + datetime.timedelta(1)
startdate = enddate - datetime.timedelta(5)

resultxml = c.GetExchangeRates(startDate=str(startdate), endDate=str(enddate), currencyNames='USD,EUR,CHF')['GetExchangeRatesResult']
xmldoc = BeautifulSoup(resultxml)
for day in xmldoc.mnbexchangerates.findAll('day'):
    print day['date']
    for rate in day:
        print '\t', rate['unit'], rate['curr'], ' = ', rate.text, 'HUF'

PHP


$objClient = new SoapClient("http://www.mnb.hu/arfolyamok.asmx?WSDL", array('trace' => true));
$currrates = $objClient->GetExchangeRates(array('startDate' => "2015-09-25", 'endDate' => "2015-09-30", 'currencyNames' => "EUR,USD,CHF"))->GetExchangeRatesResult;
$dom_root = new DOMDocument();
$dom_root->loadXML($currrates);

$searchNode = $dom_root->getElementsByTagName("Day")

foreach( $searchNode as $searchNode ) {
    $date = $searchNode->getAttribute('date');
    print $date . "\n";
    $rates = $searchNode->getElementsByTagName( "Rate" ); 
    foreach( $rates as $rate ) {
        print "\t" . $rate->getAttribute('unit') . " " ;
        print $rate->getAttribute('curr');
        print "  =  ";
        print $rate->nodeValue;
        print " HUF\n";
    }
}