Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyciaganie danych z xml
Forum PHP.pl > Forum > PHP
Piotr333
Witam.

Mam problem. Potrzebuję wyciągnąć pewne wartości z pliku xml, a dokładnie z linku
http://www.malopolska.pl/_layouts/WrotaMal...ata.aspx?data=2

Plik jest cały czas aktualizowany i zmieniają się dane pomiarowe oraz godzina i wpłynięcia. Potrzebuje napisać skrypt,który wyciągnie tylko najnowszą wartość parametru PM10 ze stacji Kraków ul. Bujaka(akualna).
Odrazu chciałbym zaznaczyć że jestem nowicjuszem jeżeli chodzi o pisanie w php. Potrzebuje tylko wskazówek
Napisałem coś takiego

  1. <?php
  2. $curl = curl_init();
  3. curl_setopt($curl, CURLOPT_URL, 'http://www.malopolska.pl/_layouts/WrotaMalopolski/XmlData.aspx?data=2');
  4. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  5. $dane = curl_exec($curl);
  6. curl_close($curl);
  7.  
  8.  
  9. $Current = new SimpleXMLElement($dane);
  10. $data = $Current->Item[224];
  11. echo " ".$data->Date;
  12. echo "<br/>\n";
  13.  
  14. echo" Wynik= " .$data->Value;
  15. echo " ".$data->Pollutant;
  16. echo " ".$data->City;
  17. echo "<br/>\n\n\n";
  18.  
  19. ?>


Jednak numerki Item się zmieniają i za każdym razem otrzymuję inny Parametr.
Proszę o jakąś podpowiedź czym to ugryźć..
Felan
Są dwa sposoby. Pierwszym jest iteracja przez całość aż do napotkania pierwszego takiego wyniku, który posiada wartości:

  1. <City>Kraków, ul. Bujaka</City>
  2. <Pollutant>PM10</Pollutant>


Ten wynik łapiemy, przerywamy pętlę i wypisujemy.
Twój kod na "mój" sposób:

  1.  
  2. <?php
  3.  
  4. $curl = curl_init();
  5. curl_setopt($curl, CURLOPT_URL, 'http://www.malopolska.pl/_layouts/WrotaMalopolski/XmlData.aspx?data=2');
  6. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  7. $dane = curl_exec($curl);
  8. curl_close($curl);
  9.  
  10. $Current = new SimpleXMLElement($dane);
  11.  
  12. foreach($Current->Item as $item) {
  13.  
  14. if ($item->City == "Kraków, ul. Bujaka" && $item->Pollutant == "PM10") {
  15.  
  16. $data = $item;
  17.  
  18. break; //przerywamy pętlę, bo już mamy to, co chcemy - dalsze wyniki są starsze, a więc zbędne
  19. }
  20. }
  21.  
  22. echo " ".$data->Date;
  23. echo "<br/>\n";
  24.  
  25. echo" Wynik= " .$data->Value;
  26. echo " ".$data->Pollutant;
  27. echo " ".$data->City;
  28. echo "<br/>\n\n\n";
  29.  
  30.  


Drugim sposobem jest wykorzystanie xpath - wtedy jednak też musimy zrobić pętlę. To rozwiązanie wydaje mi się nieco szybsze (nie iterujemy przez całego XML-a, tylko przez to, co daje nam xpath, przez co foreach ma "mniej roboty"):

  1. <?php
  2.  
  3. $curl = curl_init();
  4. curl_setopt($curl, CURLOPT_URL, 'http://www.malopolska.pl/_layouts/WrotaMalopolski/XmlData.aspx?data=2');
  5. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  6. $dane = curl_exec($curl);
  7. curl_close($curl);
  8.  
  9. $Current = new SimpleXMLElement($dane);
  10.  
  11. $nodes = $Current->xpath('//Current/Item/City[.="Kraków, ul. Bujaka"]/parent::*'); //do tablicy $nodes łapiemy wszystko, co ma "Kraków, Ul. Bujaka" jako City
  12.  
  13. foreach($nodes as $item) {
  14.  
  15. if ($item->Pollutant == "PM10") { //tutaj nie musimy już sprawdzać, czy City to "Bujaka", bo już to wiemy - xpath zwrócił tylko takie
  16.  
  17. $data = $item;
  18.  
  19. break;
  20. }
  21. }
  22.  
  23. echo " ".$data->Date;
  24. echo "<br/>\n";
  25.  
  26. echo" Wynik= " .$data->Value;
  27. echo " ".$data->Pollutant;
  28. echo " ".$data->City;
  29. echo "<br/>\n\n\n";


Wszystko będzie śmigać prawidłowo, dopóki wyniki w XML-u będą posortowane od najnowszego do najstarszego. Jeśli to też będzie się zmieniać, to trzeba będzie dopisać fragment kodu, w którym będziesz eliminować starsze wyniki.
Comandeer
Hmm… Skoro już się bawimy XPath to czemu nie pobawić się porządnie? wink.gif

Skoro już mamy miasto to potrzebujemy jeszcze sprawdzić czy ten sam rodzic nie zawiera odpowiedniego Pollutant, więc można zastosować following-sibling. Dodatkowo można też kazać XPath zwrócić tylko 1. wynik (bo tam będzie najnowsze info). Tym samym uzyskujemy takie ładne zapytanie:
Kod
(//Current/Item/City[.="Kraków, ul. Bujaka"]/following-sibling::Pollutant[.="PM10"]/parent::*)[1]


Zatem całość będzie wyglądać tak:
  1. <?php
  2.  
  3. $curl = curl_init();
  4. curl_setopt($curl, CURLOPT_URL, 'http://www.malopolska.pl/_layouts/WrotaMalopolski/XmlData.aspx?data=2');
  5. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  6. $dane = curl_exec($curl);
  7. curl_close($curl);
  8.  
  9. $Current = new SimpleXMLElement($dane);
  10.  
  11. $data = $Current->xpath('(//Current/Item/City[.="Kraków, ul. Bujaka"]/following-sibling::Pollutant[.="PM10"]/parent::*)[1]')[0]; //do tablicy $nodes łapiemy wszystko, co ma "Kraków, Ul. Bujaka" jako City
  12. echo " ".$data->Date;
  13. echo "<br/>\n";
  14.  
  15. echo" Wynik= " .$data->Value;
  16. echo " ".$data->Pollutant;
  17. echo " ".$data->City;
  18. echo "<br/>\n\n\n";
Piotr333
Witam.
Dziękuję za odpowiedzi. Jestem bardzo wdzięczny.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.