2

我有一个巨大的 XML 文件。但是,我只对这棵大树的一个小子树感兴趣。我想解析这个子树,但我不想浪费时间解析整个巨大的树,因为我只打算使用它的一小部分。

理想情况下,我想扫描文件直到找到这个子树的开头,解析子树直到我到达它的结尾,然后甚至不费心阅读文件的其余部分。甚至可以用 XPath 表达式描述我感兴趣的子树。有没有办法使用lxml做到这一点?看起来您可以使用该iterparse()方法执行类似的操作,但根据文档,它看起来不会生成我想要使用的已解析对象。有什么建议么?

(不需要使用 lxml,但我想使用 Python,理想情况下我希望它很快。)

4

2 回答 2

1

我的印象是 iterparse 是你想要的。查看http://lxml.de/parsing.html上的“选择性标签事件”部分,这似乎给了你想要的东西:

context = etree.iterparse(xmlfile, tag="yourSubTree")
action, elem = context.next()
etree.iterwalk(elem, ...)...

似乎 XPath 也可以工作,但我猜 XPath 在返回之前读取整个树,而我希望 iterparse 只遍历树直到它匹配。值得对这两种方法进行分析。

于 2010-03-06T00:00:40.937 回答
0

Iterparse 仍然需要将所有内容解析到您想要的子树。在使用正则表达式将子树输入解析器之前提取子树可能更有效。您可能想尝试编写一个 sax 解析器。Sax 可能比 lxml 慢,但它不会使用太多内存,因此在某些情况下它可能会更好。

于 2010-03-06T00:09:17.857 回答