Tarkoituksena olisi saada parsittua kätevästi alla olevasta xml tiedostosta esimerkiksi ruotsin kruunun (SEK) kurssi. En haluaisi tehdä purkka viritelmää, vaan käyttää php:n fuktioita xml:n parsimiseen.
http://www.ecb.europa.eu/stats/eurofxref/
Minulla tuo Xml-parsiminen on hakusessa, enkä löytänyt kätevää opasta sen opetteluun. Miten minun pitäisi lähteä liikkeelle tuon parsimisessa?
Auttaisiko PHP:n XML-referenssi?
Yritin kattoo tuolta apuja, mutta en saannut tarpeeksi niistä selkoa
Yksi hyvä tapa on päätellä noista funktion nimistä, että mitä funktio mahtaa tehdä ja jos ei sitä muuten keksi, niin lukee selostuksen. Lähes jokaisesta funktiosta on myös useampi kuin yksi esimerkki, joten niitä kannattaa katsella, sitä paitsi saatat löytää niistä suoran ratkaisun omaan ongelmaasi... Toisena vaihtoehtona voidaan kaiketi pitää DOMia.
Tässä esimerkkinä vielä.
<?php $valittu_valuutta = (isset($_GET['valuutta'])) ? $_GET['valuutta'] : "SEK"; $tiedosto= "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; $dok = new DOMDocument(); $dok->Load($tiedosto); $valuutan_arvo = false; $valuutat = $dok->getElementsByTagName("Cube"); for ($i = 0; $i < $valuutat->length; ++$i) { $valuutta= $valuutat->item($i)->getAttribute("currency"); if ($valuutta == $valittu_valuutta) { $valuutan_arvo = $valuutat->item($i)->getAttribute("rate"); break; } } if (!$valuutan_arvo) { echo "<p>Väärä nimi valuutalle!</p>"; } else { echo"<p>Valitun valuutan arvo on {$valittu_arvo}</p>"; } ?>
Ei testattua koodia, mutta pitäisi toimia.
EDIT: Teuro kerkeski laittaan yksinkertaisemman koodin, vaihdan käyttämään sitä, ettei ois niin paljo purkkaa.
EDIT2:
Testattu versio Teuron koodist. Toimii :) Laitoin tänne, jos jollekulle muulle tulee vielä sama ongelma
<?php $valittu_valuutta = "SEK"; $tiedosto= "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; $dok = new DOMDocument(); $dok->Load($tiedosto); $valuutan_arvo = false; $valuutat = $dok->getElementsByTagName("Cube"); for ($i = 0; $i < $valuutat->length; ++$i) { $valuutta= $valuutat->item($i)->getAttribute("currency"); if ($valuutta == $valittu_valuutta) { $valuutan_arvo = $valuutat->item($i)->getAttribute("rate"); break; } } if (!$valuutan_arvo) { echo "<p>Väärä nimi valuutalle!</p>"; } else { echo "<p> {$valittu_valuutta}:n arvo on {$valuutan_arvo}</p>"; } ?>
ja jätin ny alapuolelle vielä oman purkkaviritelmän....
--------------------------------------------
Näin sitten ratkaisin. Ekana on funktio joka muuntaa xml-tiedoston taulukoksi. Sen jälkeen käyn taulukkoo läpi ja etsin valuutan tunnuksen, jos löytyy, niin sitten tulostetaan arvo.
Hieman hämäs ku taulukkost tuli moniulotteinen. (Siksi monta ["Cube"]a etsinnäs
<?php function objectsIntoArray($arrObjData, $arrSkipIndices = array()) { $arrData = array(); // if input is object, convert into array if (is_object($arrObjData)) { $arrObjData = get_object_vars($arrObjData); } if (is_array($arrObjData)) { foreach ($arrObjData as $index => $value) { if (is_object($value) || is_array($value)) { $value = objectsIntoArray($value, $arrSkipIndices); // recursive call } if (in_array($index, $arrSkipIndices)) { continue; } $arrData[$index] = $value; } } return $arrData; } ?> <?php $xmlUrl = "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; // XML feed file/URL $xmlStr = file_get_contents($xmlUrl); $xmlObj = simplexml_load_string($xmlStr); $arrXml = objectsIntoArray($xmlObj); for ($i=0;$i<count($arrXml["Cube"]["Cube"]["Cube"]);$i++) { if ($arrXml["Cube"]["Cube"]["Cube"][$i]["@attributes"]["currency"] == "SEK") { echo $arrXml["Cube"]["Cube"]["Cube"][$i]["@attributes"]["rate"]; } } ?>
Tässä on vielä SimpleXML-toteutus:
<?php $currency = "SEK"; $xmlUrl = "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; $xmlStr = file_get_contents($xmlUrl); $xml = new SimpleXMLElement($xmlStr); $namespaces = $xml->getDocNamespaces(); $xml->registerXPathNamespace('', $namespaces['']); $results = $xml->xpath("//*[@currency='{$currency}' and @rate]"); if (empty($results)) { echo "$currency: ?\n"; } else foreach ($results as $obj) { $arr = $obj->attributes(); $rate = $arr["rate"]; echo "$currency: $rate\n"; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.