Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: php ja xml parsiminen

Axuu [20.07.2010 11:38:08]

#

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/eurofxref-daily.xml

Minulla tuo Xml-parsiminen on hakusessa, enkä löytänyt kätevää opasta sen opetteluun. Miten minun pitäisi lähteä liikkeelle tuon parsimisessa?

Metabolix [20.07.2010 11:49:20]

#

Auttaisiko PHP:n XML-referenssi?

Axuu [20.07.2010 12:07:10]

#

Yritin kattoo tuolta apuja, mutta en saannut tarpeeksi niistä selkoa

Triton [20.07.2010 12:16:59]

#

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.

Teuro [20.07.2010 15:06:01]

#

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.

Axuu [20.07.2010 15:06:36]

#

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"];
}
}

?>

Metabolix [21.07.2010 08:49:15]

#

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";
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta