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不匹配的所有节点。)
有没有办法做到这一点?
答案 0 :(得分:1)
ElementTree是一个类似DOM的解析器,这意味着它将首先处理整个XML文档并将其保存在内存中,然后才能浏览对象。这也意味着你必须等到它完成之后才能做到。
如果您的文档非常大,您应该查看SAX parsers,它只会浏览一次文档,但不会存储所有内容,使其速度非常快且内存效率高(但也更难以使用)。
您还可以使用ElementTree的iterparse,它会在构建内部结构时报告与SAX解析器类似的元素信息。因此,您可以先阅读所需的信息,最后仍然拥有一个完整的ElementTree对象。
答案 1 :(得分:0)
您必须使用的方法是“使用目标解析器方法”E.g High-performance XML parsing in Python with lxml