Разбор большого XML-файла, содержащего "огромные" узлы в PHP - PullRequest
0 голосов
/ 30 октября 2018

Мне нужно проанализировать большой XML-файл размером около 13 Гб. Это дамп данных из системы CRM, содержащий встроенные файлы (например, документы Word) в виде текстовых узлов в кодировке base64. Некоторые из них могут быть большими.

Я использую PHPReader XML с помощью оболочки dkrnl / simplexmlreader (которая, несмотря на свое имя, использует XMLReader, not simplexml), который представляет собой потоковый парсер, поэтому большие файлы не должны быть проблемой. Это позволяет мне открыть файл XML, но при его анализе он выдает ошибку:

PHP Warning:  XMLReader::read(): ./test.xml:195057: parser error : 
xmlSAX2Characters: huge text node in
./vendor/dkrnl/simplexmlreader/library/SimpleXMLReader.php on line 113

Я понимаю, что некоторые текстовые узлы действительно могут быть большими, но это нормально для меня - у меня достаточно памяти. Обратите внимание, что сценарию не не хватает памяти, просто текстовый узел превышает некоторый произвольный предел внутреннего размера.

Я нашел различные страницы, описывающие эту же проблему на многих языках (поскольку все они ниже libxml), и большинство из них ссылаются на некоторую возможность установить опцию huge = 1 или аналогичную, разрешающую очень большие узлы. Тем не менее, я не могу найти, как это сделать в PHP XMLReader. Расширение PHP libxml определяет параметр LIBXML_PARSEHUGE, поэтому мне кажется, что мне нужно как-то использовать этот параметр с XMLReader. Я ожидал, что этот параметр можно будет установить с помощью XMLReader::setParserProperty, но не повезло.

Кто-нибудь знает, как я могу убедить XMLReader работать с огромными текстовыми узлами, или мне нужно переключиться на более низкоуровневую реализацию (которую я хотел бы избежать), такую ​​как PHP-расширения libxml или XML Parser?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...