我需要在PHP中解析相当大的XML(如300 MB)。我怎样才能最有效地做到这一点?
特别是,我需要找到特定标签并将其内容提取到平坦的TXT文件中,仅此而已。
答案 0 :(得分:10)
您可以使用PHP SAX-based parsing使用旧式xml parser functions方法读取和解析XML。
使用这种方法,您可以解析的文档大小没有实际限制,因为您只需一次读取并解析缓冲区。解析器将触发事件以指示它已找到标签,数据等。
手册中有一个simple exampl e,其中显示了如何获取标签的开头和结尾。出于您的目的,您可能还想使用xml_set_character_data_handler,以便您也可以在标签之间查看文本。
答案 1 :(得分:1)
最有效的方法是创建静态XSLT并使用XSLTProcessor
将其应用于XML。方法名称有点误导。即使您想输出纯文本,如果需要将transformToXML()
作为字符串变量,也应使用transformToURI()
,如果要编写文件,则应使用{{3}}。
答案 2 :(得分:1)
如果是一个或几个时间工作,我会使用XML Starlet。但是,如果你真的想在PHP方面做,那么我建议将它预先分解为较小的块然后进行处理。如果你通过DOM加载它作为一个大块,它将需要很多的内存。还可以使用CLI端PHP脚本来加快速度。
答案 3 :(得分:1)
这就是SAX的设计目标。当SAX遇到元素,字符数据等时,它会在一小块数据缓冲区中读取内存,并触发事件。
如何使用SAX并不总是显而易见的,我第一次使用SAX时并不是这样,但实质上你必须保持自己的状态并查看你在文档结构中的位置,所以一般来说你将最终描述描述您所在文档部分的变量,例如你遇到特定的开始/结束元素时设置的inFoo,inBar等。
有一个sax解析器here
的简短描述和示例答案 4 :(得分:1)
拉解析是要走的路。这样它的内存效率高且易于处理。我一直在处理大到50 Mb或更多的文件。
答案 5 :(得分:0)
根据您的内存要求,您可以加载它并parse it with XSLT(消耗内存的路径),或者您可以创建一个forward-only cursor并自己走树,打印您的值'重新寻找(记忆效率高的路线)。