Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [xml] Ładowanie części pliku XML, Jak załadować tylko część pliku XML
AoW
post 14.11.2008, 13:26:17
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 3.08.2005

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


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?

Ten post edytował AoW 14.11.2008, 14:30:09
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
johnson
post 14.11.2008, 14:30:52
Post #2





Grupa: Zarejestrowani
Postów: 90
Pomógł: 2
Dołączył: 3.12.2004

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


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.
Go to the top of the page
+Quote Post
Strzałek
post 29.11.2008, 13:04:13
Post #3





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

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


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


--------------------
Go to the top of the page
+Quote Post
pkwiatkowski
post 29.04.2009, 16:38:31
Post #4





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 21.02.2008

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


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. ?>


Ten post edytował pkwiatkowski 29.04.2009, 17:54:28


--------------------
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: 14.08.2025 - 05:51