Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][XML]Pobranie danych z pliku XML
tomazzi
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 14.09.2012

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


Muszę napisać skrypt, który ma pobierać ze stron http://www.nbp.pl/Kursy/xml/dir.txt, http://www.nbp.pl/Kursy/xml/a103z110530.xml średni kurs wybranej waluty z wybranego dnia. Mógby mi ktoś nakreślić schemat działania, jakich funkcji użyć? XML jest dla mnie nowością.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


simplexml
dom
+
google
lub poszukaj na forum bo była do tego gotowa klasa.

Go to the top of the page
+Quote Post
rafalskula
post
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 12.09.2010
Skąd: Wrocław

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


Masz gotowca (IMG:style_emoticons/default/smile.gif)

  1. <?php
  2. $curl = curl_init();
  3. curl_setopt($curl, CURLOPT_URL, 'http://nbp.pl/kursy/xml/LastA.xml');
  4. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  5. $dane = curl_exec($curl);
  6. curl_close($curl);
  7.  
  8. $tabela_kursow = new SimpleXMLElement($dane);
  9. // wybranie daty publikacji tabeli w NBP
  10. $data = $tabela_kursow->data_publikacji;
  11. echo $data;
  12. echo "<br/>\n";
  13.  
  14. //wybranie poszczególnych walut
  15. $czk = $tabela_kursow->pozycja[13];
  16. echo" PLN 1,00 = " .$czk->kod_waluty;
  17. echo " ".$czk->kurs_sredni;
  18. echo "<br/>\n\n\n";
  19.  
  20. ?>


Tutaj masz korony , ale możesz dać też inne waluty.

Pozdrawiam
Go to the top of the page
+Quote Post
tomazzi
post
Post #4





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 14.09.2012

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


Na razie mam takie coś:

Kod
<?php

class Waluta{
    
    var $name;
    var $date;
    
    public function __construct($name, $date) {
        $this->name = $name;
        $this->date = $date;
    }
    
    function ZwrocKurs() {
        $kursy = simplexml_load_file("http://www.nbp.pl/Kursy/xml/a103z110530.xml");
      
        foreach ($kursy->pozycja as $key) {
            $kurs = "";
            if ($key->kod_waluty == $this->name){
                $kurs = $key->kurs_sredni;
                echo "Sredni kurs waluty " . $this->name . " z dnia " . $this->date . " to " . $kurs;
            }
         }
    }
    
}

$kurs = new Waluta("GBP","2012-10-20");
$kurs->ZwrocKurs();

?>


Teraz trzebaby było skleić link do pliku XML o odpowiedniej dacie. Teraz link jest ustawiony na sztywno. Nie mam pojęcia jak się za to zabrać. Jakieś sugestie?

Ten post edytował tomazzi 25.10.2012, 16:32:24
Go to the top of the page
+Quote Post
CuteOne
post
Post #5





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


typ tabeli + numer tabeli + z + rok(dwie cyfry) + miesiac(dwie cyfry) + dzien(dwie cyfry)

np. a001z120102


Mam nadzieję, że wiesz jak przekazać datę do metody (IMG:style_emoticons/default/wink.gif)

Go to the top of the page
+Quote Post
tomazzi
post
Post #6





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 14.09.2012

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


Nie wiem czy wiem (IMG:style_emoticons/default/tongue.gif) wrzucić ją jako parametr?

Ok dzięki. Ja bym to zrobiłem w ten sposób:
1. Pobrać plik txt.
2. Zrobić z niego tablice funckja explode()
3. dopasować dany element za pomocą pearl
4. dokleić go do linku

Dobrze myśle czy są jakieś lepsze sposoby?

Mam problem gdy wywołuje funkcje
Kod
$filename = "http://www.nbp.pl/Kursy/xml/dir.txt ";
$fd = fopen($filename, "r");
$filestring = fread($fd, filesize($filename));


wywala błąd filesize(): stat failed for http://www.nbp.pl/Kursy/xml/dir.txt
Gdy zapisze plik na dysku wszytsko jest ok. Druga sprawa jak rozbić plik ten plik na tablice aby kod każdgo dokumentu XML był wartością? Explode() nie daje rady bo wymaga parametru który rozdziela kody, a w pliku wszytskie kody są jednym ciągiem.

Z tablicą już się udało nie wiem tylko co zrobić, aby móc skorzystać z funkcji fread() chyba, że jest jeszcze inny sposób? Ma ktoś może jeszcze jakiś pomysł?

Ten post edytował tomazzi 25.10.2012, 18:44:58
Go to the top of the page
+Quote Post
CuteOne
post
Post #7





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


file_get_contents();
Go to the top of the page
+Quote Post
tomazzi
post
Post #8





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 14.09.2012

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


Skryp ma pobierać średni kurs wybranej waluty ze strony NBP, po pobraniu danych skrypt korzysta z własnych danych. Ostateczna wersja (może komuś się przyda):
  1. <?php
  2.  
  3. class Waluta{
  4.  
  5. function ZwrocKurs($name, $date) {
  6. //formatowanie daty na potrzeby wyszukania ciągu w pliku txt oraz odpowiedniego pliku na stronie NBP
  7. $fdate = substr($date, 2, 2) . substr($date, 5, 2) . substr($date,8 ,2);
  8. //jeśli plik cache.txt i jest w nim zapisany kurs o wymaganym kodzie i dacie wyświetlamy go
  9. if(file_exists("cache.txt") && preg_match("/$fdate\:\s+$name\:\s+\d,\d\d\d\d/", file_get_contents("cache.txt"), $matches)){
  10.  
  11. echo "Sredni kurs waluty (pobrany z pliku cache.txt) " . $name . " z dnia " . $date . " to " . substr($matches[0], 13,6);
  12.  
  13. //jeśli plik nie istnieje, bądź nie znaleziono wymaganego kursu pobieramy odpowiedni plik ze strony NBP
  14. }else{
  15. $link = "";
  16. //pobranie pliku z kodami do plików XML
  17. $file = file_get_contents("http://www.nbp.pl/Kursy/xml/dir.txt") or die("System nie mógł pobrać pliku");
  18. //wyszukanie wymaganego kodu
  19. $test = preg_match("/a\d\d\d.$fdate/", $file, $machtable);
  20.  
  21. if(!$test){
  22. die("Brak pliku o podanej z wybraną datą. Najprawdopodobniej wybrałeś dzień w którym nie publikowano kursów walut");
  23. }else{
  24. $link .= $machtable[0];
  25. }
  26. //parsowanie wymaganego pliku XML
  27. $courses = simplexml_load_file("http://www.nbp.pl/Kursy/xml/$link.xml");
  28.  
  29. foreach ($courses->pozycja as $key) {
  30. if ($key->kod_waluty == $name){
  31. $course = $key->kurs_sredni;
  32. echo "Sredni kurs waluty (pobrany ze strony NBP) " . $name . " z dnia " . $date . " to " . $course;
  33. //tworzenie bądź dopisanie do istniejącego pliku ciąg z datą, kodem oraz kursem waluty
  34. $fp = fopen("cache.txt", "a+");
  35. $fout = fwrite($fp, "$fdate" . ":" . " $key->kod_waluty" . ":" . " $key->kurs_sredni\r");
  36. fclose($fp);
  37. }
  38. }
  39. }
  40.  
  41. }
  42.  
  43. }
  44.  
  45. $kurs = new Waluta;
  46. $kurs->ZwrocKurs("GBP", "2012-10-15");
  47.  
  48.  
  49. ?>


Proszę o komentarze co można efektywniej zrobić.
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: 25.08.2025 - 11:29