Gå til innhold

Hente ut data fra xml-fil


Anbefalte innlegg

Hei

 

Jeg ønsker å hente ut værdata fra denne xml filen: http://www.yr.no/sted/Norge/Hordaland/Berg...rgen/varsel.xml

 

hvor jeg da henter ut alle værdataene slik at jeg kan søke med frem til en spesifikk dato innenfor disse og vise den frem. Tenker at dette nok henter ut ved hjelp av DOM.

 

Mitt spørsmål er følgende. Er det noen som har dette i fingerspissende og har/eller kan lage et raskt script som gjør nettopp dette? Ellers er alle tips og hint på veien til stor hjelp.

 

Cato

Lenke til kommentar
Videoannonse
Annonse

Hei

Er ikke helt sikker på hva du er ute etter om du skal ha søkemulighet eller bare liste ut perioden.

Har et script her som jeg har funnet på PHP.net sine sider og modifisert det noe til min testing og kan være et utgangspunkt.

 

Skulle det ikke være noe slikt som du var ute etter så se bort fra denne :thumbup:

 

<?php
if (!($fp=@fopen("http://www.yr.no/sted/Norge/Hordaland/Bergen/Bergen/varsel.xml", "r"))) die ("Couldn't open XML.");



$usercount=0;
$userdata=array();
$state='';

$userdataHead = array();
$usercount2=0;

function startElementHandler ($parser,$name,$attrib){
global $usercount;
global $userdata;
global $state;
global $value;

global $userdataHead;
global $usercount2;


switch ($name) {


case $name=="TIME" : {
$userdata[$usercount]["from"] = $attrib["FROM"];
$userdata[$usercount]["to"] = $attrib["TO"];
$userdata[$usercount]["period"] = $attrib["PERIOD"];


break;
}
case $name=="SYMBOL" : {
$userdata[$usercount]["number"] = $attrib["NUMBER"];
$userdata[$usercount]["symname"] = $attrib["NAME"];
break;
}
case $name=="PRECIPITATION" : {
$userdata[$usercount]["prevalue"] = $attrib["VALUE"];

break;
}
case $name=="WINDDIRECTION" : {
$userdata[$usercount]["deg"] = $attrib["DEG"];

break;
}
case $name=="WINDSPEED" : {
$userdata[$usercount]["mps"] = $attrib["MPS"];
$userdata[$usercount]["winname"] = $attrib["NAME"];
break;
}
case $name=="TEMPERATURE" : {
$userdata[$usercount]["temp"] = $attrib["VALUE"];
break;
}
default : {$state=$name;break;}
}
}

function endElementHandler ($parser,$name){
global $usercount;
global $userdata;
global $state;
$state='';
if($name=="TIME") {$usercount++;}
}

function characterDataHandler ($parser, $data) {
global $usercount;
global $userdata;
global $state;
if (!$state) {return;}
if ($state=="TITLE") { $userdata[$usercount]["tittel"] = $data;}
if ($state=="BODY") { $userdata[$usercount]["body"] = $data;}
}

if (!($xml_parser = xml_parser_create())) die("Couldn't create parser.");
xml_set_element_handler( $xml_parser, "startElementHandler", "endElementHandler");
xml_set_character_data_handler( $xml_parser, "characterDataHandler");

while( $data = fread($fp, 4096)){
if(!xml_parse($xml_parser, $data, feof($fp))) {break;}}
xml_parser_free($xml_parser);


?>
<html>
<head>
<title>Testing PHP XML parser</title>
<style type="text/css">
<!--
.style24 {font-size: 12}
.style26 {font-size: 12px; font-weight: bold; }
-->
</style>
</head>
<body>
Test av værdata fra Yr.no - Værdata over Bergen<br /><br />
<?php
for ($a=0;$a<$usercount; $a++)
{
if ($userdata[$a]["tittel"]<>"")
{
echo "<b>".iso_UTF8($userdata[$a]["tittel"])."</b><br />";
echo iso_UTF8($userdata[$a]["body"])."<br /><br />";
}
}


echo "
	<table width=\"600\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
	  <tr>
		<td width=\"150\"><span class=\"style26\">Fra / Til </span></td>
		<td width=\"38\"><span class=\"style24\"> </span></td>
		<td width=\"60\"><div align=\"center\"><span class=\"style26\">Nedbør</span></div></td>
		<td width=\"60\"><div align=\"center\"><span class=\"style26\">Vind retning </span></div></td>
		<td width=\"60\"><div align=\"center\"><span class=\"style26\">Vind styrke </span></div></td>
		<td width=\"50\"><div align=\"center\"><span class=\"style26\">Temp</span></div></td>
		<td><span class=\"style24\"> </span></td>
	  </tr>";


$date;
$teller=0;
$datakl = explode("T", $userdata[$i]["from"]);
$date = $datakl[0];
$arrUkedag = array('Monday' => 'Mandag','Tuesday' => 'Tirsdag', 'Wednesday' => 'Onsdag', 'Thursday' => 'Torsdag', 'Friday' => 'Fredag', 'Saturday' => 'Lørdag', 'Sunday' => 'Søndag');


for ($i=0;$i<$usercount; $i++)
{


if ($userdata[$i]["period"]<>""){		
	$datakl = explode("T", $userdata[$i]["from"]);
	$datakl2 = explode("T", $userdata[$i]["to"]);
	$str=strftime("%A",date_to_timestamp($datakl[0]));
	$klfra=explode(":",$datakl[1]);
	$kltil=explode(":",$datakl2[1]);
	$fra=$klfra[0].":".$klfra[1];
	$til=$kltil[0].":".$kltil[1];
	$bilde = $userdata[$i]["number"].".png";

	if ($teller == 0){
echo "<tr>
		<td colspan=\"7\" class=\"style24\"><b>".$arrUkedag[$str]."   ".$datakl[0]."</b><br /></td>
	  </tr>";
		}


if ($datakl[0]<> $date && $teller <>0){
echo "<tr>
		<td colspan=\"7\" class=\"style24\"><hr /><br /><b>".$arrUkedag[$str]."   ".$datakl[0]."</b><br /></td>
	  </tr>";
}

echo "<tr>
		<td width=\"150\" class=\"style24\">".$fra." - ".$til."</td>
		<td width=\"38\" class=\"style24\"><img src=\"image/sky/$bilde\" Width=\"38px\" height=\"38\" border=\"0\" /></td>
		<td width=\"60\" class=\"style24\"><div align=\"center\">".$userdata[$i]["prevalue"]." mm"."</div></td>
		<td width=\"60\" class=\"style24\"><div align=\"center\">".$userdata[$i]["deg"]."</div></td>
		<td width=\"60\" class=\"style24\"><div align=\"center\">".$userdata[$i]["mps"]."m/s "."</div></td>
		<td width=\"50\" class=\"style24\"><div align=\"center\">".$userdata[$i]["temp"]."°"."</div></td>
		<td class=\"style24\">".ucfirst(iso_UTF8($userdata[$i]["symname"]))." - ".ucfirst($userdata[$i]["winname"])." fra ".navigation($userdata[$i]["deg"])."</td>
	  </tr>";




			$date = $datakl[0];
			$teller++;
		}

}
echo "</table>";





function date_to_timestamp($date)
{
$split_date = split ('-', $date);

$split_date[5]='00';
$split_date[4]='00';
$split_date[3]='00';

$timestamp = mktime ($split_date[3], $split_date[4], $split_date[5], $split_date[1], $split_date[2], $split_date[0]);
return $timestamp;
}


function iso_UTF8($UtfIso) {
	$UtfIso = str_replace("æ", "æ", $UtfIso);//æ
	$UtfIso = str_replace("Æ", "Æ", $UtfIso);//Æ
	$UtfIso = str_replace("ø", "ø", $UtfIso);//ø
	$UtfIso = str_replace("Ø", "Ø", $UtfIso);//Ø
	$UtfIso = str_replace("Ã¥", "å", $UtfIso);//å
	$UtfIso = str_replace("Ã…", "Å", $UtfIso);//Å

return $UtfIso;
}

function navigation($grader)
{
global $navngrader;

switch ($grader)
{
case ($grader <= 33.74 AND $grader >= 0): {$navngrader="nord"; break;}
case ($grader <= 78.74 AND $grader >= 33.75): {$navngrader="nord øst"; break;}
case ($grader <= 123.74 AND $grader >= 78.75): {$navngrader="øst"; break;}
case ($grader <= 168.74 AND $grader >= 123.75): {$navngrader="sør øst"; break;}
case ($grader <= 213.74 AND $grader >= 168.75): {$navngrader="sør"; break;}
case ($grader <= 258.74 AND $grader >= 213.75): {$navngrader="sør vest"; break;}
case ($grader <= 303.74 AND $grader >= 258.75): {$navngrader="vest"; break;}
case ($grader <= 348.74 AND $grader >= 303.75): {$navngrader="nord vest"; break;}
case ($grader <= 360 AND $grader >= 348.75): {$navngrader="nord"; break;}
}

return $navngrader;
}
?>
</table>
</body><html>

Lenke til kommentar
Hei

Er ikke helt sikker på hva du er ute etter om du skal ha søkemulighet eller bare liste ut perioden.

Har et script her som jeg har funnet på PHP.net sine sider og modifisert det noe til min testing og kan være et utgangspunkt.

 

Skulle det ikke være noe slikt som du var ute etter så se bort fra denne :thumbup:

 

<?php
if (!($fp=@fopen("http://www.yr.no/sted/Norge/Hordaland/Bergen/Bergen/varsel.xml", "r"))) die ("Couldn't open XML.");



$usercount=0;
$userda......
.................................

case ($grader <= 360 AND $grader >= 348.75): {$navngrader="nord"; break;}
}

return $navngrader;
}
?>
</table>
</body><html>

 

 

Strålende! Virker å være et veldig bra utgangspunkt. Du har ikke tilfeldigvis tilgang på de værsymbolene også? eller vet hvor de finnes?

Lenke til kommentar

Et lite spørsmål til deg Icaro2

 

Har sett litt på scriptet ditt og ser veldig bra ut, men tenkte jeg skulle stille deg et raskt spørsmål. Dersom jeg ønsket å KUN vise værdata for eksempelvis 15.april 08 kl 18-00 (eller 18-20).

Er det en enkelt sak å tilpasse scriptet ditt til det, og evt. hvordan?

 

Takker uansett så langt for strålende hjelp.

Lenke til kommentar

Hei

Bra du kunne bruke scriptet

Har symboler fra YR her som vedlegg

 

Når du skal hente ut bare 1 dato ser jeg for meg en test mot dato og klokkeslett og er det riktig så vis kun denne forekomsten.

Har ikke testet noe slik mulighet men det er der jeg ville startet

sky.zip

Endret av Icaro2
Lenke til kommentar
Hei

Bra du kunne bruke scriptet

Har symboler fra YR her som vedlegg

 

Når du skal hente ut bare 1 dato ser jeg for meg en test mot dato og klokkeslett og er det riktig så vis kun denne forekomsten.

Har ikke testet noe slik mulighet men det er der jeg ville startet

 

 

Forsøker meg på det... takker for symbolene

Lenke til kommentar

alle symboler ligger på yr sin server. Se api.yr.no.

Vil anbefale å hente de ut der, for da får du uansett rett.

 

Værmelding for gitt tidspunkt: xml-filene fra yr (i alle fall de som baserer seg på lengde-/breddegrad) gir det værmelding for alle tidspunkt på aktuelt sted 10 dager frem i tid. Første 3(?) døgn er det timesmelding, så blir det værmelding for 3 og 3 timer.

 

Sjekk "from"-attributtet i xml'en, er lett å finne nærmeste hele time. Om du kan XPath er det en enkel og genial måte å finne frem på, men er ikke noen stor jobb å løse det hele i php heller.

 

Vil anbefale deg å sette deg godt inn i dokumentasjonen, den inneholder egentlig veldig mye fin info :)http://api.yr.no/weatherapi/documentation

Lenke til kommentar
Nå er det vel ikke lov til å bruke ikonene fra yr.no da.

 

Anbefaler dessuten folk å se på enten simpleXML eller XSL for å gjøre denne jobbe i PHP.

Selvfølgelig er det lov å hente ut ikoner fra yr. Sett deg inn i api'en ;)http://api.yr.no/weatherapi/weathericon/1.0/documentation

 

XSLT er sikkert en grei måte å sortere og hente ut data, selv ville jeg allikevel holdt en knapp på XPath - som jo er omtrent to sider av samme sak :)

 

---

 

Forstod ikke helt problemet uranus - url'en ?s=vaer fungerer da fint den!

Lenke til kommentar
Nå er det vel ikke lov til å bruke ikonene fra yr.no da.

 

Anbefaler dessuten folk å se på enten simpleXML eller XSL for å gjøre denne jobbe i PHP.

Selvfølgelig er det lov å hente ut ikoner fra yr. Sett deg inn i api'en ;)http://api.yr.no/weatherapi/weathericon/1.0/documentation

 

XSLT er sikkert en grei måte å sortere og hente ut data, selv ville jeg allikevel holdt en knapp på XPath - som jo er omtrent to sider av samme sak :)

 

---

 

Forstod ikke helt problemet uranus - url'en ?s=vaer fungerer da fint den!

Jeg tok feil ang. ikonene, jeg trodde bare man kunne bruke XML-ene.

Jeg har vært inne i de fleste apiene der, dessverre er det ikke alle du har lov til å bruke, f.eks. et geografisk punkt som ikke har en side på yr.no, men heldigvis fant jeg ut at mye av det samme kan hentes fra api.met.no

(Ting kan ha endret seg siden jeg fikk mailen fra Erik Bolstad, men den gangen sa han at det apiet var for kommersiell bruk)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...