0

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 不匹配的节点)。

有没有办法做到这一点?

4

2 回答 2

1

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

如果您的文档非常大,您应该查看SAX 解析器,它只会遍历文档一次但不会存储所有内容,从而使其非常快速且内存高效(但也更难使用)。

您还可以使用 ElementTree 的iterparse,它会在构建其内部结构时报告它遇到的类似于 SAX 解析器的元素的信息。所以你可以更早地阅读你想要的信息,最后仍然有一个完整的 ElementTree 对象。

于 2013-06-07T16:16:55.943 回答
0

你必须使用类似“使用目标解析器方法”之类的东西,例如在 Python 中使用 lxml 进行高性能 XML 解析

于 2013-06-07T17:22:51.080 回答