我正在尝试有效地编辑相当大的 XML 文件(通常为 100-500MB,但最大为 1GB),以删除所有不包含具有给定值的属性的元素的出现。我正在寻找在速度方面执行此操作的最有效方法,同时也不会将大量数据加载到内存中,因为这对于较大的文件来说是一个问题。
使用示例 XML,结构如下所示,其中父元素可以相互嵌套任意次数。
<root>
<parent>
<child id="c1">
<content />
</child>
<child id="c2">
<content />
</child>
</parent>
<parent>
<parent>
<child id="c3">
<content />
</child>
</parent>
</parent>
</root>
使用上面的示例 XML,我试图删除 ID 不等于“c1”的所有子元素,以给出以下结果:
<root>
<parent>
<child id="c1">
<content />
</child>
</parent>
<parent>
<parent />
</parent>
</root>
到目前为止,我想出的最有效的方法是使用 cElementTree iterparse:
import xml.etree.cElementTree as ET
xml_source = 'xml file location'
xml_output = 'xml output file location'
context = ET.iterparse(xml_source, events=("start", "end"))
context = iter(context)
event, root = context.next()
for event, elem in context:
if event == 'end' and elem.tag == 'child' and elem.attrib['id'] != 'c1':
elem.clear()
ET.ElementTree(root).write(xml_output)
以上将在大约 10 秒内处理大小为 100MB 的测试文件,有没有更有效的方法来实现这一点?