Avatar billede angermann Nybegynder
15. maj 2006 - 18:15 Der er 5 kommentarer

simplexml og Yahoo Weather-feed

I dette RSS-feed:

http://xml.weather.yahoo.com/forecastrss?p=DAXX0009&u=c

vil jeg gerne hive temperaturen ud vha. simplexml.

Linien ser sådan ud:

<yweather:condition text="Mostly Cloudy" code="28" temp="12" date="Mon, 15 May 2006 5:20 pm CEST"/>

og det drejer sig om attributten "temp".

Min kode ser ligenu sådan ud:

$file = "http://xml.weather.yahoo.com/forecastrss?p=DAXX0009&u=c";
$xml = simplexml_load_file($file);
$item = $xml->channel->item->yweather:condition;
echo $item[temp];

Men den giver en fejl fordi jeg ikke bare sådan uden lige kan tilgå "yweather:condition".

Hvordan gør jeg det rigtigt?

Mvh.
Thomas
Avatar billede jakobdo Ekspert
15. maj 2006 - 18:33 #1
Prøv at kig på eksemplet her: http://dk.php.net/manual/da/function.simplexml-load-file.php
Eksempel 1. Interpret an XML document

Og se hvad var_dump() giver af output.
Det bør du kunne finde en mulighed at komme frem til temp.
Avatar billede angermann Nybegynder
15. maj 2006 - 18:49 #2
Tak for linket, men det hjælper mig ikke rigtigt videre.

Problemet er vidst nok at yweather-elementet har et namespace-prefix, hvilket gør at man ikke kan tilgå det på normal vis.

Har forsøgt med nedenstående kode, ingen fejl denne gang, men et tomt output.

$feed = simplexml_load_file('http://xml.weather.yahoo.com/forecastrss?p=DAXX0009&u=c');
foreach ($feed->item as $item) {
  $ns = $item->children('http://xml.weather.yahoo.com/ns/rss/1.0');
  $temp = $ns->condition;
  echo $temp[temp];
}

Nogle ideer?

Var-dump ser sådan ud:

object(SimpleXMLElement)#1 (2) { ["@attributes"]=> array(1) { ["version"]=> string(3) "2.0" } ["channel"]=> object(SimpleXMLElement)#2 (8) { ["title"]=> string(31) "Yahoo! Weather - Copenhagen, DA" ["link"]=> string(114) "http://us.rd.yahoo.com/dailynews/rss/weather/Copenhagen__DA/*http://xml.weather.yahoo.com/forecast/DAXX0009_c.html" ["description"]=> string(33) "Yahoo! Weather for Copenhagen, DA" ["language"]=> string(5) "en-us" ["lastBuildDate"]=> string(29) "Mon, 15 May 2006 6:20 pm CEST" ["ttl"]=> string(2) "60" ["image"]=> object(SimpleXMLElement)#3 (5) { ["title"]=> string(14) "Yahoo! Weather" ["width"]=> string(3) "142" ["height"]=> string(2) "18" ["link"]=> string(25) "http://weather.yahoo.com/" ["url"]=> string(59) "http://us.i1.yimg.com/us.yimg.com/i/us/nws/th/main_142b.gif" } ["item"]=> object(SimpleXMLElement)#4 (5) { ["title"]=> string(45) "Conditions for Copenhagen, DA at 6:20 pm CEST" ["link"]=> string(114) "http://us.rd.yahoo.com/dailynews/rss/weather/Copenhagen__DA/*http://xml.weather.yahoo.com/forecast/DAXX0009_c.html" ["pubDate"]=> string(29) "Mon, 15 May 2006 6:20 pm CEST" ["description"]=> object(SimpleXMLElement)#5 (0) { } ["guid"]=> string(30) "DAXX0009_2006_05_15_18_20_CEST" } } }
Avatar billede angermann Nybegynder
15. maj 2006 - 20:43 #3
Har sådan set løst mit problemet ved at bruge Xpath:

$feed = simplexml_load_file("http://xml.weather.yahoo.com/forecastrss?p=DAXX0009&u=c");
foreach ($feed->xpath("/rss/channel/item/yweather:condition") as $condition) {
  echo $condition[temp];
}

Ville dog stadig gerne have et bud på hvordan man gør det uden en Xpath-søgning.
Avatar billede jakobdo Ekspert
15. maj 2006 - 22:08 #4
Der springer jeg desværre over, så meget har jeg ikke arbejdet med simplexml.
Måske coderdk kan hjælpe her?
Synes jeg har set ham i mange tråde med simplexml()
Avatar billede mobildata Nybegynder
22. maj 2006 - 13:24 #5
Kan klart anbefale denne her, der henter fra MSN Weather

http://www.biglickmedia.com/misc/php/msn-weather.php
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester