xml — PHP foreach при обработке чанков

В настоящее время я пытаюсь обработать большой файл 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> найден при загрузке файла кусками?

Заранее спасибо!

3

Решение

Если вам нужно проанализировать большой XML-файл, я предлагаю объединить XMLReader с DOM. Используйте XMLReader для получения узла элемента чанка, разверните его в 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');
}
4

Другие решения

Я бы порекомендовал PHP методы DomDocument. Это полезно для анализа документов 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

0