Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyciaganie danych z xml, Wybrany element
Piotr333
post
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
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
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? (IMG:style_emoticons/default/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
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
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 21:10