当前位置:  开发笔记 > 编程语言 > 正文

在Python中拆分大型XML文件

如何解决《在Python中拆分大型XML文件》经验,为你挑选了3个好方法。

我希望将一个巨大的XML文件拆分成更小的位.我想浏览文件以查找特定标记,然后获取之间的所有信息,然后将其保存到文件中,然后继续浏览文件的其余部分.

我的问题是试图找到一种干净的方式来记录标签的开始和结束,这样我就可以在我用"for line in f"扫描文件时抓取文本内部

我宁愿不使用sentinel变量.是否有一种pythonic方法来完成这项工作?

该文件太大,无法读入内存.



1> Van Gale..:

处理XML数据有两种常用方法.

一个叫做DOM,代表文档对象模型.这种XML解析风格可能就是您在查看文档时所看到的,因为它将整个XML读入内存以创建对象模型.

第二种叫做SAX,它是一种流式传输方法.解析器开始读取XML并向代码发送有关某些事件的信号,例如,当找到新的开始标记时.

所以SAX显然是你所需要的.Sax解析器可以在xml.sax和xml.parsers.expat下的python库中找到.



2> Jeff Bauer..:

您可以考虑在这种情况下使用ElementTree iterparse函数.



3> Jeroen Dirks..:

我已经成功使用cElementTree.iterparse方法来执行类似的任务.

我有一个大的xml文档,带有标记'resFrame'的重复'条目',我想过滤掉特定ID的条目.这是我用于它的代码:

源文档有这种结构


  ....
  ....
  ....
  ...
  234234.....
  344234.....
  ...
  ...

我使用以下脚本创建了一个较小的doc,它具有相同的结构,bucket条目和只有具有特定id的resFrame条目.

#!/usr/bin/env python2.6

import xml.etree.cElementTree as cElementTree
start = '''
'''

def main():
    print start
    context = cElementTree.iterparse('snap.xml', events=("start", "end"))
    context = iter(context)
    event, root = context.next() # get the root element of the XML doc

    for event, elem in context:
        if event == "end":
            if elem.tag == 'bucket': # i want to write out all  entries
               elem.tail = None  
               print cElementTree.tostring( elem )
            if elem.tag == 'resFrame':
                if elem.find("id").text == ":4:39644:482:-1:1": # i only want to write out resFrame entries with this id
                    elem.tail = None
                    print cElementTree.tostring( elem )
            if elem.tag in ['bucket', 'frame', 'resFrame']:
                root.clear()  # when done parsing a section clear the tree to safe memory
    print ""

main()

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有