在PHP中解析大XML

时间:2009-03-18 17:40:37

标签: php xml

我需要在PHP中解析相当大的XML(如300 MB)。我怎样才能最有效地做到这一点?

特别是,我需要找到特定标签并将其内容提取到平坦的TXT文件中,仅此而已。

6 个答案:

答案 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并自己走树,打印您的值'重新寻找(记忆效率高的路线)。