Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [xml] Ładowanie części pliku XML
Forum PHP.pl > Forum > XML, AJAX > XML
AoW
Witam,

w zasadzie to moje początki z XMLem. Dziś spędziłem mnóstwo czasu nad tym, żeby sczytać dane z pliku XML - wiem, niby banalne, ale wciąż miałęm jakieś błędy.

Udało mi się odpowiednie odczytać plik xml i wyciągnąć z jego dane za pomocą:

  1. <?php
  2. $plik = simplexml_load_file("plik.xml");
  3. foreach($plik as $wartosc)
  4. echo $wartosc->ZMIENNA
  5. ?>


Znalazłem to zresztą gdzieś tutaj na forum (przejrzałem tylko podstron, że nie pamiętam gdzie dokłądnie).

Mam jednak problem: plik XML jest duży ok 4 MB, i w momencie, kiedy pokazuję choćby 5 rekordów na stronie, czas ładowania strony zwiększa się o ok 10 sekund.

Czy mogę jakoś odczytywać plik xml częściami? Sprawdzałem manual do funkcji simplexml_load_file, jednak nic nie znalazłem. Nie wiem czy istnieje w ogóle taka możliwość, stąd mój post tutaj na forum.

Za wszelkie sugestie będę wdzięczny.

Pozdrawiam

PS)

Właśnie pomyślałem, że mógłbym ominąć powyższy problem, jeśli potrafiłbym zrobić rzecz następującą:
załóżmy, że w moim pliku XML jest rekord o tagu <data>01.01.2008 12.23</data>.
Poza tym plik xml ma sto tysięcy innych danych, które teraz mnie nie interesują.

Czy mogę bez ładowania całego pliku - simplexml_load_file("plik.xml") - odczytać konkretny rekord, w tym przypadku data?
Może powinienem się zainteresować innym parserem, nie simpleXML a może DOM. Czy to rozwiązałoby problem?
johnson
Możesz przeczytać część pliku np. funkcją fgets" title="Zobacz w manualu PHP" target="_manual a później użyć simplexml_ load_ string" title="Zobacz w manualu PHP" target="_manual. Może być problem jeśli chciałbyś się dostać do środka lub końca pliku, ale takie już są "zalety" plików tekstowych.
Strzałek
Zacznijmy do tego że to co chcesz zrobić będzie bardzo wolne gdyż operowanie na plikach XML do szybkich nie należy. I teraz są 2 rozwiązania. Pierwsze - masz to gdzieś i bawisz się dalej XML, a jeżeli chcesz wyciągać jakieś konkretne dane z pliku XML to polecam zainteresować się XPath, polecam mój artykuł - link w stopce. Drugie rozwiązanie to zrobić cache tego pliku do tablicy php i operować sobie normalnie na tablicach.

Krótko odpowiadając na Twoje pytanie:

Cytat
Czy mogę bez ładowania całego pliku - simplexml_load_file("plik.xml") - odczytać konkretny rekord, w tym przypadku data?
Może powinienem się zainteresować innym parserem, nie simpleXML a może DOM. Czy to rozwiązałoby problem?


Tak, użyj XPath - http://pl.php.net/manual/pl/function.simpl...ement-xpath.php
pkwiatkowski
Witam ja mam podobny problem, ja chciałbym odczytać pierwszą sekcję <item> a nie wiem jak to zrobić. Część pliku xml wklejam poniżej i mój wyduszony kod i jego efekt


Plik XML:
  1. <?xml version="1.0" encoding="ISO-8859-2"?>
  2.  
  3. <rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule">
  4.  
  5. <channel>
  6. <title>helion.pl - nowości</title>
  7. <link>http://helion.pl</link>
  8. <description>Informacje o nowościach i promocjach helion.pl</description>
  9. <language>pl</language>
  10. <copyright>Copyright 2004, helion.pl</copyright>
  11. <pubDate>Wed Apr 29 18:29:54 CEST 2009
  12. </pubDate>
  13. <lastBuildDate>Wed Apr 29 18:29:54 CEST 2009
  14. </lastBuildDate>
  15. <managingEditor>mjeczalik@helion.pl</managingEditor>
  16. <webMaster>mjeczalik@helion.pl</webMaster>
  17.  
  18. <image>
  19. <title>helion.pl</title>
  20. <url>http://helion.pl/rss/helionpl.gif</url>
  21. <link>http://helion.pl</link>
  22. <width>100</width>
  23. <height>52</height>
  24. <description>Logo helion.pl</description>
  25. </image>
  26.  
  27. <item>
  28. <title>Promocja dnia: Excel 2007 PL. Seria praktyk</title>
  29. <description>Książkę Excel 2007 PL. Seria praktyk przygotowano w taki sposób, aby każdy mógł nauczyć się korzystać z narzędzi Excela, tworzyć odpowiednie arkusze oraz wykonywać na nich praktyczne operacje. Wszystkie porady i instrukcje napisane zostały prostym, zrozumiałym językiem. Dzięki temu szybko opanujesz sposoby zarządzania danymi czy szacowania formuł w tym programie. Wszystkie omawiane zagadnienia zilustrowane są ułatwiającymi zrozumienie zrzutami ekranowymi, a kolorowy druk znacznie uprzyjemni Ci korzystanie z książki. Wystarczy ją przeczytać, a poznasz Excela w stopniu pozwalającym Ci na swobodną pracę w tym programie. </description>
  30. <guid isPermaLink="true">http://helion.pl/ksiazki/ex27sp.htm</guid>
  31. <enclosure url="http://helion.pl/ksiazki/ex27sp.htm" type="text/html" />
  32. </item>
  33.  
  34. <item>
  35. <title>Nowość: Kompendium DTP. Adobe Photoshop, Illustrator, InDesign i Acrobat w praktyce</title>
  36. <description>Książka Kompendium DTP. Adobe Photoshop, Illustrator, InDesign i Acrobat w praktyce to wyjątkowy podręcznik, opisujący nie tylko funkcje i narzędzia dostępne w przedstawionych programach, ale także zagadnienia związane z profesjonalnym przygotowaniem publikacji do druku. W związku z tym stanowi niezastąpiony poradnik dla wszystkich, którzy chcieliby szybko i bez problemu poznać zasady edycji i tworzenia grafiki oraz odpowiedniego jej opracowania na potrzeby drukarni tak aby gotowy produkt był zgodny z oczekiwaniami odbiorcy.</description>
  37. <guid isPermaLink="true">http://helion.pl/ksiazki/kompdt.htm</guid>
  38. <pubDate>2009-04-29</pubDate>
  39. <enclosure url="http://helion.pl/ksiazki/kompdt.htm" type="text/html" />
  40. </item>
  41.  
  42. ...
  43. ...
  44. ...


To co narazie mi się udało zrobić w PHP:
  1. <?php
  2. $dom = new DOMDocument();
  3.  $dom->load(&#092;"http://helion.pl/rss/rss.cgi\");
  4.  
  5.  $xpath = new DOMXPath($dom);
  6.  $persons = $xpath->query(&#092;"/rss/channel/item/title\");
  7.  
  8.  foreach ($persons as $person) {
  9.  echo $person->nodeValue.&#092;"
  10.  &#092;";
  11.  }
  12.  ?>


I poniżej efekt skryptu PHP:
Kod
Promocja dnia: Excel 2007 PL. Seria praktyk
   Nowość: Kompendium DTP. Adobe Photoshop, Illustrator, InDesign i Acrobat w praktyce
   Nowość: Excel 2007 PL. Seria praktyk
   Nowość: Photoshop CS3 PL. Seria praktyk
   Nowość: Access 2007 PL. Seria praktyk
   Nowość: PowerPoint 2007 PL. Seria praktyk
   Nowość: Windows Vista PL. Seria praktyk
   Nowość: Word 2007 PL. Seria praktyk
   Nowość: Fotografia cyfrowa dla bystrzaków. Wydanie V
   Nowość: Microsoft Project 2007 PL. Nieoficjalny podręcznik
   Nowość: Head First SQL. Edycja polska


A ja chciałbym żeby się wyświetliła tylko pierwsza linijka tzn:
Kod
Promocja dnia: Excel 2007 PL. Seria praktyk



EDIT:

no poradziłem sobie sam tak jak lubię winksmiley.jpg przeczytałem w manualu przykład: http://pl.php.net/manual/pl/function.simpl...-file.php#88615 i przerobilem go na swój problem

  1. <?php
  2. $plik = simplexml_load_file('http://helion.pl/rss/rss.cgi', 'SimpleXMLElement', LIBXML_NOCDATA);
  3. $result['title'] = $plik->xpath("/rss/channel/item/title");
  4.  
  5. foreach($result as $key => $attribute)
  6. {
  7.      $i=0;
  8.     foreach($attribute as $element)
  9.     {
  10.        $ret[$i][$key] = (string)$element;
  11.        $i++;
  12.     }
  13. }
  14. echo $ret[0]['title'];
  15. ?>
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.