使用python检索xml节点的子集

时间:2013-06-07 15:59:48

标签: python xml

xml非常新手。

我有一个xml文件,这个表格非常大:

<a>
  <b>
    <id>1</id>
    ...
  </b>
  <b>
    <id>2</id>
    ...
  </b>
  <b>
    <id>3</id>
    ...
  </b>
  <b>
    <id>4</id>
    ...
  </b>
</a>

b中有一些我想要检索的信息,我正在尝试关注python帮助文档。 我从这开始:

#!/usr/bin/env python

import xml.etree.ElementTree as ET

tree = ET.parse('data.xml')
root = tree.getroot()

print 'root.tag = ', root.tag
print 'root.attrib = ', root.attrib

但是因为我的文件很大,所以只需几分钟即可完成这一部分。

我想做的是这样的事情:

for node in (n for n in nodes if n.id in ['1', '3']):
  print node.val1
  print node.val2

(无需处理与我想要的id不匹配的所有节点。)

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

ElementTree是一个类似DOM的解析器,这意味着它将首先处理整个XML文档并将其保存在内存中,然后才能浏览对象。这也意味着你必须等到它完成之后才能做到。

如果您的文档非常大,您应该查看SAX parsers,它只会浏览一次文档,但不会存储所有内容,使其速度非常快且内存效率高(但也更难以使用)。

您还可以使用ElementTree的iterparse,它会在构建内部结构时报告与SAX解析器类似的元素信息。因此,您可以先阅读所需的信息,最后仍然拥有一个完整的ElementTree对象。

答案 1 :(得分:0)

您必须使用的方法是“使用目标解析器方法”E.g High-performance XML parsing in Python with lxml