PHP & XML

Zaczęty przez Szopler, 24 Wrzesień 2010, 23:53

Szopler

1) - Ktoś tu zna się na PHP?

2) Mam plik XML o strukturze:

<?xml version="1.0"?>
<MDFile>
<DateTime>
<Date>24.09.10</Date>
<Time>22:23:00</Time>
</DateTime>
<MeteoData>
<Internal>
<IntTemp>22,5</IntTemp>
<IntHumi>57</IntHumi>
<RelPres>989,0</RelPres>
<AbsPres>10101010,0</AbsPres>
<IntDewP>13,5</IntDewP>
</Internal>
<External>
<ExtTemp>14,6</ExtTemp>
<ExtHumi>82</ExtHumi>
<ExtDewP>11,6</ExtDewP>
<WindDir>Południe / Południowy-Wschód</WindDir>
<WindSpd>2,9</WindSpd>
<WindChill>14,1</WindChill>
<Gust>3,7</Gust>
</External>
</MeteoData>
</MDFile>


3) Muszę w najprostszy sposób wyciągnąć daną np. ExtTemp i wyświetlić na stronie

4) Przeglądam tutoriale PHP, ale już mnie kompletnie zaćmiło i nie wiem jak to zorbić :(

5) Please, help...

Mori

<?php
$input 
file_get_contents('twoj.xml');
if( 
preg_match('#<ExtTemp>(.*)</ExtTemp>#iU'$input$matches) )
echo $matches[1];
else
echo 'Nie znaleziono';
?>

Tak na szybko.

Szopler

#2
Jak otworzyć plik blokowo? Przypuszczalnie mam w delphi kod:

TDataRec = packed record
DanaA : Single;
DanaB : Integer;
i tak dalej...
End;

var
DataRec : Array of TDataRec;
NofRec : LongWord;

...
S:=FileSize(F);
NofRec:= S div 56;
For k:=1 to NofRec do BlockRead(F, DataRec[k-1],56);
...


Jest jakiś odpowiednik BlockRead czy trzeba w pętlach czytać po 56 znaków (pętlami) i do tablicy ładować ??

sesef

W C jest funkcja fgets z tego co sprawdziłem w manualu w PHP też, więc powinno zadziałać.

http://php.net/manual/en/function.fgets.php

Mori

Jest i fread: http://pl2.php.net/manual/en/function.fread.php
Ewentualnie file_get_contents: http://pl2.php.net/manual/en/function.file-get-contents.php

Szopler

Została mi jedna rzecz do zrobienia... konwersja daty z DELPHI-owego DateTime do PHP-owego.
Znalazłem w necie taki kodzik:

function DateAdd($interval, $number, $date)
{
   $date_time_array = getdate($date);
   $hours = $date_time_array['hours'];
   $minutes = $date_time_array['minutes'];
   $seconds = $date_time_array['seconds'];
   $month = $date_time_array['mon'];
   $day = $date_time_array['mday'];
   $year = $date_time_array['year'];

   switch ($interval) {
       case 'yyyy':
           $year+=$number;
           break;
       case 'q':
           $year+=($number*3);
           break;
       case 'm':
           $month+=$number;
           break;
       case 'y':
       case 'd':
       case 'w':
           $day+=$number;
           break;
       case 'ww':
           $day+=($number*7);
           break;
       case 'h':
           $hours+=$number;
           break;
       case 'n':
           $minutes+=$number;
           break;
       case 's':
           $seconds+=$number;
           break;
   }
      $timestamp= mktime($hours,$minutes,$seconds,$month,$day,$year);
   return $timestamp;
}

function ConvertDateTime($DelphiTime)
{
     $Days = intval($DelphiTime);
     $Fraction = $DelphiTime - $Days;
     $Seconds = $Fraction / (1/24/60/60);
     $DateTime = strval(DateAdd("d",$Days,"30/12/1899 00:00:00"));
     $DateTime = strval(DateAdd("s",$Seconds,$DateTime));
     return $DateTime;
}


Datę pobieram z pliku w formacie http://4programmers.net/Delphi/Double :

$paczka = fread($DAT_plik,56);
$dataczas = unpack('d1DataCzas', substr($paczka, 1, 8));

Gdzie $dataczas - zmienna typu TDateTime przechowuje ilość dni, które upłynęły od 30 grudnia 1899 roku (w Delphi).

Wywołanie w PHP:
echo '<br>'.ConvertDateTime($dataczas['DataCzas']);

Daje błąd:
Cytat: 'PHP'Notice: A non well formed numeric value encountered in C:\meteo\unit1.php on line 22
czyli w linii:
$date_time_array = getdate($date);

Mori

Manual nie gryzie...
http://pl2.php.net/manual/en/function.getdate.php :
Cytatarray getdate ([ int $timestamp = time() ] )

Returns an associative array containing the date information of the timestamp, or the current local time if no timestamp is given.
Widzisz, jaki on tam parametr przyjmuje?