Parsowanie dużych plików XML w PHP – optymalne rozwiązanie

Ostatnio musiałem napisać aplikację do obsługi hurtowni która dysponowała sporym cennikiem XML (~50MB) w dodatku aplikacja musiała działać na dość słabych serwerach wirtualnych. Z natywnych rozwiązań najlepsze to SimpleXML oraz XMLReader. Obydwa niestety nie pasowały do moich potrzeb, pierwszy ładuje cały plik do pamięci co mogło by powodować problemy na serwerach z mniejszą ilością RAM a drugi nie jest nieco skomplikowany przy przetwarzaniu dokumentu. Znalazłem ciekawe połączenie obydwóch metod.

Rozwiązanie z jakiego skorzystałem to połączanie obydwóch bibliotek :

$myXmlFile = 'data.xml';

$reader = new XMLReader();
$reader->open($myXmlFile);
while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'item') {
            $doc = new DOMDocument('1.0', 'UTF-8');
            $xml = simplexml_import_dom($doc->importNode($reader->expand(), true));
            
            echo $xml->name;
    }
}

Drzewo dokumentu xml przemierzamy przy pomocy XMLReader'a który jest oszczędny w zużyciu pamięci a następnie pożądane node'y ładujemy sobie w formie poręcznego obiektu  SimpleXML'em.

Opcja ta jest nieco bardziej zasobożerna od czystego XMLReader ale pozwala wygodniej poruszać się po dokumencie.

Więcej informacji:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *