Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [XML][PHP] Pobranie odpowiednich danych z pliku XML
kstawinski
post 30.05.2017, 18:04:07
Post #1





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

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


Witam, poniższy kod generuje mi 6 wyników z odpowiednio: nazwą serwisu, tytułem posta, opisem posta i odnośnikiem do niego. To jest okej i działa jak najbardziej w porządku, ale przed tym wyświetla mi się nazwa serwisu tyle razy, ile jest znaczników <item> w pliku xml. W czym może tkwić problem i jak go rozwiązać?

  1. <?php
  2. $xml = simplexml_load_file("__odnosnik do pliku xml__");
  3.  
  4. foreach ($xml as $channel)
  5. {
  6. foreach($channel as $item)
  7. {
  8. echo $channel->title;
  9. echo $item->link;
  10. echo $item->title;
  11. echo $item->description;
  12. ';
  13. }
  14. }
  15.  
  16. ?>

Go to the top of the page
+Quote Post
Szado
post 30.05.2017, 23:07:33
Post #2





Grupa: Zarejestrowani
Postów: 22
Pomógł: 4
Dołączył: 30.05.2017

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


Ciężko gdybać nie znając schematu XML-a, ale zgaduję, że $channel->title; zawiera właśnie nazwę serwisu z którego aktualnie listujesz wpisy. Wyrzuć po prostu pierwsze echo do pierwszej pętli.
Go to the top of the page
+Quote Post
kstawinski
post 1.06.2017, 19:53:10
Post #3





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

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


Teraz nazwa serwisu wyświetla się tylko raz (na początku listy). Da rade zrobić, aby wyświetlała się raz obok każdego tytułu?

Edit:
Zauważyłem jeszcze jeden błąd. Poniżej zamieszczam cały kod, wraz z linkiem do pliku XML. Chodzi o to, że tym razem pojawia się 6 pustych divów, a po nich to co powinno się w nich znaleźć - tytuł i opis posta.

  1. <?php
  2. $xml = simplexml_load_file("http://blog.piotrnalepa.pl/feed/");
  3.  
  4. foreach ($xml as $channel)
  5. {
  6. echo $channel->title;
  7.  
  8. foreach($channel as $item)
  9. {
  10. echo $item->link;
  11. echo $item->title;
  12. echo $item->description;
  13. }
  14. }


up

Ten post edytował kstawinski 31.05.2017, 12:46:34
Go to the top of the page
+Quote Post
bostaf
post 1.06.2017, 20:45:26
Post #4





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Rzuciłem sobie to wszystko na
  1. var_dump('<pre>', $xml);

i zobaczyłem, że pierwsze 6 elementów to nie są wpisy bloga tylko jego parametry (title, link, ...). Trzeba je jakoś pominąć i załatwione. Tak na szybko z property_exists:
  1. $xml = simplexml_load_file("http://blog.piotrnalepa.pl/feed/");
  2.  
  3. foreach ($xml as $channel)
  4. {
  5. echo $channel->title;
  6.  
  7. foreach($channel as $item)
  8. {
  9. if (property_exists($item, 'link')) {
  10. echo $item->link;
  11. echo $item->title;
  12. echo $item->description;
  13. }
  14. }
  15. }

Ale na pewno da się inaczej i może bardziej skutecznie/ergonomiczne.
Go to the top of the page
+Quote Post
kstawinski
post 4.06.2017, 20:06:50
Post #5





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

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


Cytat(bostaf @ 1.06.2017, 21:45:26 ) *
Rzuciłem sobie to wszystko na
  1. var_dump('<pre>', $xml);

i zobaczyłem, że pierwsze 6 elementów to nie są wpisy bloga tylko jego parametry (title, link, ...). Trzeba je jakoś pominąć i załatwione. Tak na szybko z property_exists:
  1. $xml = simplexml_load_file("http://blog.piotrnalepa.pl/feed/");
  2.  
  3. foreach ($xml as $channel)
  4. {
  5. echo $channel->title;
  6.  
  7. foreach($channel as $item)
  8. {
  9. if (property_exists($item, 'link')) {
  10. echo $item->link;
  11. echo $item->title;
  12. echo $item->description;
  13. }
  14. }
  15. }

Ale na pewno da się inaczej i może bardziej skutecznie/ergonomiczne.


Wszystko działa, dzięki bardzo wink.gif
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: 18.07.2025 - 00:28