Avatar billede r4wh1d3 Nybegynder
28. december 2013 - 12:27 Der er 11 kommentarer og
1 løsning

XML fra vejrstation kan ikke parses i PHP

Hej alle.
Vidste ikke helt om jeg skulle poste dette iunder PHP eller i XML, men nu forsøger jeg i denne kategori, eftersom jeg i PHP har et problem med at parse følgende XML:

<response>
<current_weather>
<temperature unit="c">
<current value="5.5"/>
<feels_like value="5.5"/>
</temperature>
<humidity value="91"/>
<pressure value="993.23" trend="0.00" unit="hPa"/>
<wind>
<speed value="1.4" unit="kph"/>
<direction value="90"/>
<gust value="4.8" unit="kph"/>
</wind>
<sky>
<precipitation>
<rain>
<rate value="0.00" unit="mmph"/>
<daily_total value="0.00" unit="mm"/>
</rain>
</precipitation>
</sky>
<auto_update>
<interval value="65"/>
</auto_update>
</current_weather>
</response>


Jeg ved godt, at xml-filen ikke er helt fornuftig da den bl.a. mangler "<?xml version="1.0" encoding="UTF-8"?>" men principielt burde det vel ikke være et større problem.

XML-filen er genereret via WUHU ( et softwareprogram til brug for forskellige typer af vejrstationer, men jeg har via følgende PHP-script ikke kunnet formå, at læse noget som helst ud:

<?php

// Her checker jeg om det overhovedet kan lade sig gøre på serveren da jeg kun har PHP4

if (! ($xmlparser = xml_parser_create ()) )
{
die  ("Cannot create parser");
}

$filename = "weatherreport.xml";
if (!($fp = fopen ($filename, "r"))) { die ("Problem med ".$filename); }
while ($data = fread ($fp, 4096)){
  $data=eregi_replace (">"."[[:space:]]+"."< ",">< ",$data);
  if (!xml_parse ($xmlparser, $data, feof ($fp))) {
      $reason = xml_error_string (xml_get_error_code ($xmlparser));
      $reason .= xml_get_current_line_number ($xmlparser);
      die ($reason);
  }
}
xml_parser_free ($xmlparser);

function start_tag($parser, $name, $attribs) {
  echo  "Nuværende tag : ".$name."<br />";
  if (is_array ($attribs)) {
      echo  "Data : <br />";
      while(list($key,$val) = each ($attribs)) {
        echo  "Data ".$key." har værdien ".$val."<br />";
      }
    }
}

?>


så jeg er langsomt, men sikkert ved, at give op.
Det er en ung teenager, der har fået en vejrstation i julegave og nu sidder vi her ( og kan ikke andet ) uden mulighed for, at komme videre i teksten, hvilket selvfølgelig ærgrer mig.

Vil derfor virkelig være superglad, såfremt nogen eller nogle, lige har en løsning til, hvordan værdierne kan udlæses ved anvendelse af PHP.
Det skal i parantes bemærkes, at jeg desværre ikke er nogen "haj" til PHP, men jeg har en nogenlunde fornemmelse, blot ikke i ovennævnte ;)

På forhånd tak.
Avatar billede repox Seniormester
28. december 2013 - 12:41 #1
Opdater dit PHP og brug SimpleXML.
Avatar billede arne_v Ekspert
28. december 2013 - 23:32 #2
Det var absolut godt at opdatere (PHP blev releaset i 2004!).

Men XML'er er valid, saa selv PHP 4 parser burde kunne klare den.

Det er bare svaert at sige mere, naar du ikke forklarer hvilken fejl du faar.
Avatar billede r4wh1d3 Nybegynder
03. januar 2014 - 23:23 #3
Foreløbig tak til repox og arne_v

Desværre er jeg ikke kommet meget videre m.h.t. udlæsning af vejrdata under forsøg med følgende:

<?

$postXML = trim(file_get_contents('weatherreport.xml'));

$xml = simplexml_load_string($postXML);

$current = (string)$xml->current;
$humidity = (string)$xml->humidity;
$pressure = (string)$xml->pressure;
$speed = (string)$xml->speed;
$direction = (string)$xml->direction;
$gust = (string)$xml->gust;

....


Kan det have noget at gøre med, at de data jeg forsøger at hive ud af XML-filen jo er definerede "VALUES".

Er simpelthen ved at løbe tør her :)
Avatar billede arne_v Ekspert
04. januar 2014 - 00:09 #4
Til inspiration:

<?php
$xmlstr = '<response>
<current_weather>
<temperature unit="c">
<current value="5.5"/>
<feels_like value="5.5"/>
</temperature>
<humidity value="91"/>
<pressure value="993.23" trend="0.00" unit="hPa"/>
<wind>
<speed value="1.4" unit="kph"/>
<direction value="90"/>
<gust value="4.8" unit="kph"/>
</wind>
<sky>
<precipitation>
<rain>
<rate value="0.00" unit="mmph"/>
<daily_total value="0.00" unit="mm"/>
</rain>
</precipitation>
</sky>
<auto_update>
<interval value="65"/>
</auto_update>
</current_weather>
</response>';
$xmldoc = simplexml_load_string($xmlstr);
print_r($xmldoc);
$current_weather = $xmldoc->current_weather;
echo $current_weather->temperature->current->attributes()['value'][0] . "\r\n";
echo $current_weather->humidity->attributes()['value'][0] . "\r\n";
?>
Avatar billede r4wh1d3 Nybegynder
04. januar 2014 - 10:06 #5
Tak arne_v  ;)
for hurtig tilbagemelding og jeg forsøgte mig straks her til morgen, men får denne fejlmeddelelse med din eksempelkode:

Parse error: syntax error, unexpected '[', expecting ',' or ';' in /mounted-storage/Xyz/www/vejr/udsigt.php on line 31

Den pågældende server har PHP Version 5.2.42 og de små grå hår begynder, at vise sig i min sparsomme hårpragt.
Avatar billede arne_v Ekspert
05. januar 2014 - 03:24 #6
Hvad med:

<?php
$xmlstr = '<response>
<current_weather>
<temperature unit="c">
<current value="5.5"/>
<feels_like value="5.5"/>
</temperature>
<humidity value="91"/>
<pressure value="993.23" trend="0.00" unit="hPa"/>
<wind>
<speed value="1.4" unit="kph"/>
<direction value="90"/>
<gust value="4.8" unit="kph"/>
</wind>
<sky>
<precipitation>
<rain>
<rate value="0.00" unit="mmph"/>
<daily_total value="0.00" unit="mm"/>
</rain>
</precipitation>
</sky>
<auto_update>
<interval value="65"/>
</auto_update>
</current_weather>
</response>';
$xmldoc = simplexml_load_string($xmlstr);
print_r($xmldoc);
$current_weather = $xmldoc->current_weather;
$temperature = $current_weather->temperature;
$current = $temperature->current;
$attributes = $current->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";
$humidity = $current_weather->humidity;
$attributes = $humidity->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";
?>
Avatar billede r4wh1d3 Nybegynder
05. januar 2014 - 17:54 #7
Hej Arne

CUDOS herfra.
Nu spiller det næsten som en solskinsdag.
Har dog en lille hage som jeg ikke helt ved, hvad skyldes, da jeg ikke er voldsomt meget inde i XML, men antager, at det er en slags childnode, nærmere bestem den variabel der "hedder" trend.

Koden har jeg modificeret lidt i begyndelsen, da jeg ikke har XML'en inde i PHP-scriptet, så det foreløbigt ser således ud:

<?php

$file = 'weatherreport.xml';
if(!$xml = simplexml_load_file($file))
  exit('Kunne ikke hente filen '.$file);
// print_r($xml);

// $xmldoc = simplexml_load_string($xml);

$xmldoc = $xml;

// print_r($xmldoc);
$current_weather = $xmldoc->current_weather;
$temperature = $current_weather->temperature;
$current = $temperature->current;
$attributes = $current->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";


$feels_like = $current_weather->temperature->feels_like;
$attributes = $feels_like->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";

$humidity = $current_weather->humidity;
$attributes = $humidity->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";


$pressure = $current_weather->pressure;
$attributes = $pressure->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";

$trend = $pressure->trend;
$attributes = $trend->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";

$speed = $current_weather->wind->speed;
$attributes = $speed->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";

$direction = $current_weather->wind->direction;
$attributes = $direction->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";

.....

// osv. uden problemer, men værdien af variablen trend kan jeg ikke få udlæst efter at have anvendt samme opskrift som med de andre værdier

?>
Avatar billede arne_v Ekspert
05. januar 2014 - 18:07 #8
$pressure = $current_weather->pressure;
$attributes = $pressure->attributes();
$value = $attributes['value'][0];
echo $value . "\r\n";
$trend = $attributes['trend'][0];
echo $trend . "\r\n";

vil jeg tro
Avatar billede r4wh1d3 Nybegynder
06. januar 2014 - 11:46 #9
Hej Arne

Du er da noget af en haj ;)

Hvis du nogensinde kommer til den nordlige del af Falster i sommerhalvåret, så lad mig det vide, da jeg så gerne giver en meget stor øl eller 2.

Tusinde tak for din indsats.

Bedste hilsener
John
Avatar billede arne_v Ekspert
06. januar 2014 - 20:07 #10
og et svar fra mig
Avatar billede arne_v Ekspert
06. januar 2014 - 20:08 #11
Falster ligger ikke lige omkring hjoernet i forhold til hvor jeg bor.

:-)
Avatar billede r4wh1d3 Nybegynder
06. januar 2014 - 21:34 #12
OK, men if ($yourlocation == mylocation){
$beer = ($beer + $beer)
}

Tusinde tak herfra
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