仅解析XML文件的特定子树

时间:2010-03-05 23:14:41

标签: python xml parsing subtree

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

理想情况下,我想扫描文件,直到找到此子树的开头,解析子树直到我到达它的末尾,然后甚至不打扰读取文件的其余部分。甚至可能用XPath表达式描述我感兴趣的子树。有没有办法使用lxml执行此操作?看起来您可以使用iterparse()方法执行此类操作,但基于文档,看起来它不会生成我想要使用的已解析对象。有什么建议吗?

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

2 个答案:

答案 0 :(得分:1)

我觉得iterparse就是你想要的。看看http://lxml.de/parsing.html处的“选择性标记事件”部分,似乎可以满足您的需求:

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

似乎XPath也可以工作,但我猜测XPath在返回之前会读取整个树,而我希望iterparse只能在树上行走直到它有匹配。值得描述这两种方法。

答案 1 :(得分:0)

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