Svůj cyklus návodů začnu elegantním řešením načítáním velkých XML souborů.
Před několika týdny jsem se dostal do situace, kdy jsem potřeboval velice rychle zpracovat obrovské XML (80 MB) na standartním hostingu s časovým limitem 120s a paměťovým limitem 128 MB. Po chvilkovém zápolení a hledání jsem nalezl řešení.
$reader = new XMLReader();
$reader->open('obrovske.xml');
while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT):
if ($reader->localName == "jmeno_elementu_ktery_chceme") {
$node = $reader->expand();
$dom = new DomDocument();
$n = $dom->importNode($node,true);
$dom->appendChild($n);
$v = simplexml_import_dom($n);
}
break;
}
}
Jak je vidět z této ukázky, tak myšlenkově postupuji takto. XMLReader je velmi rychlý i pro velké soubory – nepotřebuje si nejdřív soubor rozparsovat, ale jde postupně. Takže si taháme jen ty nejmenší elementy, které potřebujeme a ty „nacpeme“ do DomDocument a poté do simplexml. (je samozřejmě možné úplně vynechat simplexml a rovnou tahat data z DomDocument, ale mně se líbí více tento způsob – je také velice rychlý a přitom nabízí opravdu snadnou práci s daty). Dále už s tím pracujeme jako s objektem simplexml, který se hezky rozparsuje celý, ale protože je malinký, tak je to fofr.
Snad se vám bude mé řešení líbit a možná i někomu pomůže.



