В настоящее время я пытаюсь обрабатывать большой XML-файл (1,5 ГБ), в настоящее время он открывается в кусках
$handle = fopen($url, "r") or die("Couldn't get handle"); if ($handle) { while (!feof($handle)) { $chunk = fgets($handle, 4096); // echo each chunk echo $chunk; } fclose($handle); }
Вместо эхо-ответа на этот фрагмент я бы хотел сохранить каждую строку до тех пор, пока не будет найден </file>
. для этого:
$handle = fopen($url, "r") or die("Couldn't get handle"); if ($handle) { while (!feof($handle)) { $chunk = fgets($handle, 4096); // echo '<xmp>'.$buffer.'</xmp>'; if (strpos($fullstring,'</file>') !== false) { // i should have everything between <file> and </file> // empty the $fullstring so it can fill with chunks again $fullstring = ''; } else { $fullstring .= $chunk; } } fclose($handle); }
Теперь я хотел бы запустить это в цикле foreach. Но вместо того, чтобы зацикливать каждый найденный, он устанавливает один и тот же <file></file>
для всех найденных <file></file>
.
Как я могу обработать каждый <file>content</file>
найденный при загрузке файла в куски?
Заранее спасибо!
Если вам нужно проанализировать большой XML-файл, я предлагаю объединить XMLReader с DOM. Используйте XMLReader, чтобы получить узел элемента chunk, развернуть его в DOM и использовать Xpath для извлечения деталей из куска.
$reader = new XMLReader; $reader->open($file); $dom = new DOMDocument; $xpath = new DOMXpath($dom); // look for the first chunk while ($reader->read() && $reader->localName !== 'file') { continue; } // while you have an file element while ($reader->localName === 'file') { $node = $reader->expand($dom); // $xpath->evaluate('expression', $node); // ... // move to the next chunk (next file sibling node) $reader->next('file'); }
Я бы рекомендовал методы DomDocument PHP. Это полезно для анализа XML или HTML-документов, которые вы можете получить с помощью дескриптора файла или file_get_contents
и т. Д.
http://php.net/manual/en/class.domdocument.php
Кроме того, PHP имеет возможность array_chunk
http://php.net/manual/en/function.array-chunk.php