用python解析xml文件

来源:互联网 发布:不出门而知天下 编辑:程序博客网 时间:2024/06/04 20:08

    python中解析xml文件一般可用三种库:xml.dom.minidom(python从2.0版后自带)、cElementTree(依赖于ElementTree库)、lxml(构建在两个 C 库之上:libxml2 和 libxslt)。

    当我用一个2K的xml文件来测试它们的效率时,解析时间上没有什么差别,但内存使用上分别为3.5M、2.9M、4.7M;当用968K的xml文件时,解析用时分别为0.44s、0.03s、0.02s,占用内存分别为69.0M、9.8M、12.1M;当用23M的xml文件时三者之间的效率差别就更明显了,用xml.dom.minidom.parse(filename)后电脑直接就卡得动不了,好不容易切换到终端下top一看,cpu使用率几乎到100%,内存占用直线上升,居然到1.2G了,而且还在上升,只有kill掉它;ET.parse(filename)用时0.91s,占用内存171.2M;lxml.etree.parse(filename)用时0.37s,占用内存193.7M。

     所以在解析内容很少的xml文件时,比如一些图形界面的xml文件,就用python自带的xml.dom.minidom就可以了,当然cElementTree在占用内存上最少,但安装cElementTree外,还要额外安装ElementTree模块。在解析比较大的xml文件时,xml.dom根本就应付不了,cElementTree比lxml占用更少的内存,但lxml解析时间最短。

     当然要解析超大的xml文件时,比如超过1G大小,那么就要用到ElementTree和lxml提供的iterparse 方法来迭代解析了。

 

     最近又发现两种解析xml文件的库:xml.parsers.expat 和 pyRXP。经过测试,用xml.parsers.expat来处理超大xml文件时效率更高,这主要是由于它是顺序处理,不会保存已经处理过的标记,所以不会创建一个非常大的XML内存表示。