我需要解析一个大约13Gb的大型XML文件。它是CRM系统的数据转储,并且包含嵌入式文件(例如Word docs)作为base64编码的文本节点。其中一些可能很大。
我通过dkrnl/simplexmlreader包装器(尽管其名称使用XMLReader, not simplexml)使用PHP的XMLReader,它是基于流的解析器,因此大文件应该没问题。这使我可以打开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扩展之类的较低级别的实现(我想避免)?