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.
- 7433 megtekintés
Hozzászólások
IMHO XML-t ad vissza, megnéztem egy kódomat ott ez áll:
$result = simplexml_load_string($result->GetExchangeRatesResult);
- A hozzászóláshoz be kell jelentkezni
Egy
$array = (array)$result;
echo $array['Day']['date'];
Visszaadja jól a dátumot, de nem látom hogyan tudnám lekérdezni magát az EUR-ot ami ahogy látom 8-as index alatt van a Rate részben.
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
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.)
- A hozzászóláshoz be kell jelentkezni
Én sem vagyok programozó ;)
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Az
echo $array['Day']->Rate[8];
Megadja az EUR értékét. Egynek jó, de nem az igazi.
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
Jaj ne legyél már morcos :-) Természetesen tudok scrollozni, és megnéztem a megoldásod ami tökéletesen működik. Csak közben szerettem volna megérteni hogyan működik ez az XML-es móka.
--
A főnököm mindig megtartja amit ígér, ha pénzt ígér azt is!
- A hozzászóláshoz be kell jelentkezni
A rate az egy szinttel lentebbi elem. A tömbödnek így 1db eleme lesz.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Általában semmi értelme foreach-elni, ha rögtön az első elemet visszaadod. Mondjuk PHP-ban semmin se lepődök meg :). Amúgy igen, így XPath-szel szép. Esetleg lehetne még cizellálni, hogy pl. "//Rate[@curr='$name']/text()".
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Na most éppen megy. Ha reggel is menni fog, akkor "megjavult" :)
--------------------------------
last project: www.ekaer-feladas.hu
- A hozzászóláshoz be kell jelentkezni
Köszi szépen a választ, ma reggel már nekem is ment SOAP-on keresztül, de nem bírtam várni, így fallback megoldásnak html scrapert kellett írnom az árfolyamoldalukra :( remélem azt már nem rontják el. Üdv, exac
- A hozzászóláshoz be kell jelentkezni
Valami ma is volt. Épp tegnap este javítottam ki a régi lekérdezést az egyik rendszeremben a fentebbi kódok alapján. Ma hívtak, hogy nem megy. Kb. 10 perc és újra jó volt.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
+1. Ha írsz egy online lekérdezést, ami egy másik, külső online lekérdezést hív, akkor szépen összeszoroztad a két rendszer rendelkezésre állását (gyk. 0.0-1.0 közötti számokról van szó).
- A hozzászóláshoz be kell jelentkezni
REST nem jó? Valamikor régen csináltam:
é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.
- A hozzászóláshoz be kell jelentkezni
[OffTopic] Jópofa ez a http://artinvoice.hu. Sokan használják? Annyi webes ilyen cucc van...[OnTopic]
Nem biztos, hogy egy 3rd party rendszert terhelnék az állandó lekérdezéssel...
- A hozzászóláshoz be kell jelentkezni
Bírja. Szóval csak nyugodtan.
--
Coding for fun. ;)
- A hozzászóláshoz be kell jelentkezni
Köszi ez tényleg jól működik.
- A hozzászóláshoz be kell jelentkezni
:)
--
Coding for fun. ;)
- A hozzászóláshoz be kell jelentkezni
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";
}
}
- A hozzászóláshoz be kell jelentkezni