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ę:
<?xml version="1.0" encoding="utf-8"?><katalog><GrupyTowarowe>
<GrupaGlowna id="mat" nazwa="_Materiały reklamowe">
<PodGrupy>
<PodGrupa id="mat-rek" nazwa="Materiały reklamowe" />
</PodGrupy>
</GrupaGlowna>
<GrupaGlowna id="agd" nazwa="AGD - Produkty">
<PodGrupy>
<PodGrupa id="agd-loz" nazwa="Chłodziarko-zamrażarki do zabudowy (lodówki)" />
<PodGrupa id="agd-low" nazwa="Chłodziarko-zamrażarki wolnostojące (lodówki)" />
<PodGrupa id="agd-cze" nazwa="Czajniki elektryczne" />
<PodGrupa id="agd-exp" nazwa="Ekspresy do kawy" />
<PodGrupa id="agd-kmz" nazwa="Kuchenki mikrofalowe do zabudowy" />
<PodGrupa id="agd-kmw" nazwa="Kuchenki mikrofalowe wolnostojące" />
<PodGrupa id="agd-kwz" nazwa="Kuchnie do zabudowy" />
<PodGrupa id="agd-kws" nazwa="Kuchnie wolnostojące" />
<PodGrupa id="agd-odk" nazwa="Odkurzacze" />
<PodGrupa id="agd-oka" nazwa="Okapy kuchenne" />
<PodGrupa id="agd-piz" nazwa="Piekarniki do zabudowy" />
<PodGrupa id="agd-pgz" nazwa="Płyty grzejne do zabudowy" />
<PodGrupa id="agd-prz" nazwa="Pralki do zabudowy" />
<PodGrupa id="agd-prw" nazwa="Pralki wolnostojące" />
<PodGrupa id="agd-sok" nazwa="Sokowirówki" />
<PodGrupa id="agd-sus" nazwa="Suszarki do włosów" />
<PodGrupa id="agd-zmz" nazwa="Zmywarki do zabudowy" />
<PodGrupa id="agd-zmw" nazwa="Zmywarki wolnostojące" />
<PodGrupa id="agd-zel" nazwa="Żelazka" />
</PodGrupy>
</GrupaGlowna>
</GrupyTowarowe>
<producenci>
<producent id="1CC" nazwa="1C Company" />
<producent id="2KG" nazwa="2K Games" />
<producent id="3CO" nazwa="3COM" />
<producent id="3M-" nazwa="3M" />
<producent id="3WA" nazwa="3Ware" />
</producenci>
<produkty>
<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" >
<zdjecia>
<zdjecie plik="/Pictures/ADA/ADA/ADAIBOADA0001/1.jpg" domyslne="1" data="2007-03-01" />
</zdjecia>
<technika>
<parametr nazwa="Złącza" opis="2x USB A męski <-> SATA" jm="" typ="varchar" />
<parametr nazwa="Długość kabla połączeniowego" opis="0,80" jm="m" typ="float" />
<parametr nazwa="Kolor" opis="srebrny" jm="" typ="varchar" />
<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" />
<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" />
<parametr nazwa="Informacje dodatkowe" opis="Transfer do 480Mb/s, aluminiowa obudowa" jm="" typ="varchar" />
<parametr nazwa="www" opis="http://www.i-box.pl" jm="" typ="varchar" />
</technika>
</produkt>
<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" >
<zdjecia>
<zdjecie plik="/Pictures/ZAS/BAT/ZASVERBAT0007/1.jpg" domyslne="1" data="2007-06-14" />
</zdjecia>
<technika>
<parametr nazwa="Rozmiar baterii" opis="R14" jm="" typ="varchar" />
<parametr nazwa="Napięcie" opis="1,5" jm="V" typ="float" />
<parametr nazwa="Opis" opis="Baterie Alkaliczne, na blistrze są 4 szt baterii." jm="" typ="varchar" />
</technika>
</produkt>
<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" >
<zdjecia>
<zdjecie plik="/Pictures/ZAS/BAT/ZASVERBAT0008/1.jpg" domyslne="1" data="2007-06-12" />
<zdjecie plik="/Pictures/ZAS/BAT/ZASVERBAT0008/2.jpg" domyslne="1" data="2007-06-12" />
</zdjecia>
<technika>
<parametr nazwa="Rozmiar baterii" opis="R20" jm="" typ="varchar" />
<parametr nazwa="Napięcie" opis="1,5" jm="V" typ="float" />
<parametr nazwa="Opis" opis="Baterie Alkaliczne, na blistrze są 2 szt baterii." jm="" typ="varchar" />
</technika>
</produkt>
</produkty>
</katalog>
Wiadomo, że przy parsowaniu xmlreaderem korzystamy z pętli while:
<?php
while ($xml->read()) {
$id = $xml->getAttribute('id');
$name = $xml->getAttribute('nazwa');
$opis = $xml->getAttribute('opis');
$plik = $xml->getAttribute('plik');
}
?>
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