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: