В настоящее время я пытаюсь обработать большой файл 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 для получения узла элемента чанка, разверните его в 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');
}
Я бы порекомендовал 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