Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> xmlreader, korzystał ktoś z tego?
marrrecki
post 1.07.2007, 11:15:43
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Lublin

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


siemanko. mam problem z klasą xmlreader.
Proste xml'e przechodzą gładko przez ten parser i nie ma problemu ze stworzeniem tablicy wynikowej z parsowanego xml'a. Ale co zrobić w przypadku gdy mój xml ma taką strukturę:
  1. <?xml version="1.0" encoding="utf-8"?><katalog><GrupyTowarowe>
  2. <GrupaGlowna id="mat" nazwa="_Materiały reklamowe">
  3. <PodGrupy>
  4. <PodGrupa id="mat-rek" nazwa="Materiały reklamowe" />
  5. </PodGrupy>
  6. </GrupaGlowna>
  7. <GrupaGlowna id="agd" nazwa="AGD - Produkty">
  8. <PodGrupy>
  9. <PodGrupa id="agd-loz" nazwa="Chłodziarko-zamrażarki do zabudowy (lodówki)" />
  10. <PodGrupa id="agd-low" nazwa="Chłodziarko-zamrażarki wolnostojące (lodówki)" />
  11. <PodGrupa id="agd-cze" nazwa="Czajniki elektryczne" />
  12. <PodGrupa id="agd-exp" nazwa="Ekspresy do kawy" />
  13. <PodGrupa id="agd-kmz" nazwa="Kuchenki mikrofalowe do zabudowy" />
  14. <PodGrupa id="agd-kmw" nazwa="Kuchenki mikrofalowe wolnostojące" />
  15. <PodGrupa id="agd-kwz" nazwa="Kuchnie do zabudowy" />
  16. <PodGrupa id="agd-kws" nazwa="Kuchnie wolnostojące" />
  17. <PodGrupa id="agd-odk" nazwa="Odkurzacze" />
  18. <PodGrupa id="agd-oka" nazwa="Okapy kuchenne" />
  19. <PodGrupa id="agd-piz" nazwa="Piekarniki do zabudowy" />
  20. <PodGrupa id="agd-pgz" nazwa="Płyty grzejne do zabudowy" />
  21. <PodGrupa id="agd-prz" nazwa="Pralki do zabudowy" />
  22. <PodGrupa id="agd-prw" nazwa="Pralki wolnostojące" />
  23. <PodGrupa id="agd-sok" nazwa="Sokowirówki" />
  24. <PodGrupa id="agd-sus" nazwa="Suszarki do włosów" />
  25. <PodGrupa id="agd-zmz" nazwa="Zmywarki do zabudowy" />
  26. <PodGrupa id="agd-zmw" nazwa="Zmywarki wolnostojące" />
  27. <PodGrupa id="agd-zel" nazwa="Żelazka" />
  28. </PodGrupy>
  29. </GrupaGlowna>
  30. </GrupyTowarowe>
  31. <producenci>
  32. <producent id="1CC" nazwa="1C Company" />
  33. <producent id="2KG" nazwa="2K Games" />
  34. <producent id="3CO" nazwa="3COM" />
  35. <producent id="3M-" nazwa="3M" />
  36. <producent id="3WA" nazwa="3Ware" />
  37. </producenci>
  38. <produkty>
  39. <produkt id="ADAIBOADA0001" nazwa="ADAPTER I-BOX SATA na USB ALUMINIOWY" producent="IBO" grupa="AKC-ADA" gwarancja="G024M" cena_netto="41,00" dostepny="ponad 30" dostepny_kra="1" dostepny_kat="0" data="2006-06-06"  na_zamowienie="N"  oferta_specjalna="N" >
  40. <zdjecia>
  41. <zdjecie plik="/Pictures/ADA/ADA/ADAIBOADA0001/1.jpg" domyslne="1" data="2007-03-01" />
  42. </zdjecia>
  43. <technika>
  44. <parametr nazwa="Złącza" opis="2x USB A męski &lt;-&gt; SATA" jm="" typ="varchar" />
  45. <parametr nazwa="Długość kabla połączeniowego" opis="0,80" jm="m" typ="float" />
  46. <parametr nazwa="Kolor" opis="srebrny" jm="" typ="varchar" />
  47. <parametr nazwa="Opis" opis="Łatwy w użyciu konwerter pozwoli na zmianę dysku SATA w funkcjonalne urządzenie pamięci USB zgodne ze standardem USB 2.0, pozwalając tym samym na szybkie przenoszenie i wymianę danych pomiędzy komputerem PC, Mac lub Notebookiem, a dyskiem SATA o dowolnej" jm="" typ="varchar" />
  48. <parametr nazwa="Opis" opis="pojemności. Wbudowane diody LED informują o pracy podłączonego dysku, a dodatkowa funkcja RESET pozwala na szybkie wykrycie dysku wyłączonego lub nieużywanego." jm="" typ="varchar" />
  49. <parametr nazwa="Informacje dodatkowe" opis="Transfer do 480Mb/s, aluminiowa obudowa" jm="" typ="varchar" />
  50. <parametr nazwa="www" opis="http://www.i-box.pl" jm="" typ="varchar" />
  51. </technika>
  52. </produkt>
  53. <produkt id="ZASVERBAT0007" nazwa="BATERIE ALKAICZNE VERBATIM LR14 C (2SZT)" producent="VER" grupa="ZAS-BAT" gwarancja="G001M" cena_netto="4,68" dostepny="ponad 30" dostepny_kra="0" dostepny_kat="0" data="2007-05-31"  na_zamowienie="N"  oferta_specjalna="N" >
  54. <zdjecia>
  55. <zdjecie plik="/Pictures/ZAS/BAT/ZASVERBAT0007/1.jpg" domyslne="1" data="2007-06-14" />
  56. </zdjecia>
  57. <technika>
  58. <parametr nazwa="Rozmiar baterii" opis="R14" jm="" typ="varchar" />
  59. <parametr nazwa="Napięcie" opis="1,5" jm="V" typ="float" />
  60. <parametr nazwa="Opis" opis="Baterie Alkaliczne, na blistrze są 4 szt baterii." jm="" typ="varchar" />
  61. </technika>
  62. </produkt>
  63. <produkt id="ZASVERBAT0008" nazwa="BATERIE ALKAICZNE LR20 D (2SZT)" producent="VER" grupa="ZAS-BAT" gwarancja="G001M" cena_netto="5,88" dostepny="ponad 30" dostepny_kra="0" dostepny_kat="0" data="2007-05-31"  na_zamowienie="N"  oferta_specjalna="N" >
  64. <zdjecia>
  65. <zdjecie plik="/Pictures/ZAS/BAT/ZASVERBAT0008/1.jpg" domyslne="1" data="2007-06-12" />
  66. <zdjecie plik="/Pictures/ZAS/BAT/ZASVERBAT0008/2.jpg" domyslne="1" data="2007-06-12" />
  67. </zdjecia>
  68. <technika>
  69. <parametr nazwa="Rozmiar baterii" opis="R20" jm="" typ="varchar" />
  70. <parametr nazwa="Napięcie" opis="1,5" jm="V" typ="float" />
  71. <parametr nazwa="Opis" opis="Baterie Alkaliczne, na blistrze są 2 szt baterii." jm="" typ="varchar" />
  72. </technika>
  73. </produkt>
  74. </produkty>
  75. </katalog>

Wiadomo, że przy parsowaniu xmlreaderem korzystamy z pętli while:
  1. <?php
  2. while ($xml->read()) {
  3. $id = $xml->getAttribute('id');
  4. $name = $xml->getAttribute('nazwa');
  5. $opis = $xml->getAttribute('opis');
  6. $plik = $xml->getAttribute('plik');
  7. }
  8. ?>

Ale w każdym przypadku zwracana tablica zawiera ileś tam tablic w sobie i nie sposób tego połączyć w całość. Ma ktoś jakieś doświadczenie w tym temacie? Google tutaj wiele nie radzi. Owszem napisałem skrypt który wykonuje to czego potrzebuje, ale użyłem do tego simplexml_load_file(), ale to nie sposób bo plik który parsuje ma 40MB, a przy simplexml_load_file() całość ładowana jest do ramu i strasznie obciąża serwer przy samym parsowaniu, a ja jeszcze dane z xml'a muszę wrzucić do mysql'a.

Za dobrą poradę stawiam piwko biggrin.gif
Go to the top of the page
+Quote Post
Indeo
post 1.07.2007, 12:45:49
Post #2





Grupa: Zarejestrowani
Postów: 295
Pomógł: 7
Dołączył: 26.03.2004
Skąd: Opole

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


Taki urok XML'a, że w przeciwieństwie do struktur logicznych baz danych będących zawsze macierzami prostokątnymi, xml moze opisywać struktury o dowolnie złożonej topologii (rozgałęzieniach). Nie przyglądałem się strukturze twojego xml ale podejrzewam, że problem polega własnie na tym, że oczekujesz wyniku w postaci jakiejś tablicy o i * j elementach a tymczasem okazuje sie, że jak zagłebiasz sie w dany poziom danych xml oczekujesz okreslonych danych podczas, gdy xml serwuje Ci kolejne poziomy swojej struktury smile.gif

Zderzyłem sie z tym bolesnie w przypadku parsowania plików worda zapisanych w formacie xml, ale w końcu opanowałem technikę ingerowania w pliki worda i wydobywania z nich i podmieniania dowolnych rzeczy.

Musisz rozrysować sobie na kartce topologię tego pliku xml - przewidzieć wszystkie możliwosci rozwijania jego struktury. Nie wszystkie poziomy są potrzebne do przeniesienia xml na tablicę, ale decyzje muszą być przemyślane i zazwyczaj parsowanie złozonego pliku to jazda po wszystkich węzłach z góry na dół i analizowanie każdego z osobna i w odniesieniu do nadrzędnych.


--------------------
Go to the top of the page
+Quote Post
trukszyn
post 17.03.2009, 13:13:02
Post #3





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 17.03.2009

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


Witaj!
Właśnie rozwiązałem tą kwestię kumplowi - chodzi o pobieranie danych z pliku dostarczonych przez action - wklejam , ponieważ na pewno każdy, kto będzie chciał skorzystać z funkcji zakładania sklepu partnerskiego actiona może spotkać się z tym problemem.


<?php

$xml = new XMLReader();
$xml->open($plik);

$kategorie_dostawcy_z_pliku=array();
$producenci_z_pliku=array();

while($xml->read())
{
if($xml->name == "PodGrupa")
{

$id = $xml->getAttribute('id');
$name = $xml->getAttribute('nazwa');
$kategorie_dostawcy_z_pliku[$id]=$name;

}

if($xml->name == "producent")
{

$id = $xml->getAttribute('id');
$name = $xml->getAttribute('nazwa');
$producenci_z_pliku[$id]=$name;

}

if($xml->name == "produkt")
{

$id = $xml->getAttribute('id');
$nazwa = $xml->getAttribute('nazwa');
$id_producenta = $xml->getAttribute('producent');
$id_kategorii= $xml->getAttribute('grupa');
$producent=$producenci_z_pliku[$id_producenta];
$kategoria_dostawcy=$kategorie_dostawcy_z_pliku[$id_kategorii];
$cena=$xml->getAttribute('cena_netto');
}

if($xml->name == "zdjecie")
{

$zdjecie = $xml->getAttribute('plik');

}

if($id <> NULL AND $nazwa <> NULL AND $cena <> NULL AND $kategoria_dostawcy <> NULL AND $producent <> NULL)
echo "<p>".$id.":".$nazwa.":".$cena.":".$kategoria_dostawcy.":".$producent.":".$zdjecie."</p><hr>";

}



$xml->close();


?>

Mam nadzieję, że się przyda smile.gif

Ten post edytował trukszyn 17.03.2009, 13:16:33
Go to the top of the page
+Quote Post
fiasko
post 3.10.2010, 11:06:07
Post #4





Grupa: Zarejestrowani
Postów: 243
Pomógł: 1
Dołączył: 1.06.2010

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


Fajnie - tylko, że te same produkty się powtarzają przy odczycie.
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: 10.06.2024 - 17:44