Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyciaganie danych z xml, Wybrany element
Piotr333
post 18.06.2015, 13:47:52
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 18.06.2015

Ostrzeżenie: (0%)
-----


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źć..
Go to the top of the page
+Quote Post
Felan
post 18.06.2015, 16:40:34
Post #2





Grupa: Zarejestrowani
Postów: 10
Pomógł: 6
Dołączył: 30.11.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Comandeer
post 18.06.2015, 17:34:46
Post #3





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


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";


--------------------
Go to the top of the page
+Quote Post
Piotr333
post 19.06.2015, 06:11:44
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 18.06.2015

Ostrzeżenie: (0%)
-----


Witam.
Dziękuję za odpowiedzi. Jestem bardzo wdzięczny.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 17.06.2025 - 10:22