仅解析XML文件的特定子树
我有一个非常大的XML文件,但我只对其中一个小的子树感兴趣。我想解析这个子树,但又不想浪费时间去解析整个庞大的树,因为我只会用到其中的一小部分。
理想情况下,我希望能扫描这个文件,直到找到这个子树的开始部分,然后解析这个子树,直到到达它的结束部分,之后就不想再看文件的其他部分了。也许我还可以用XPath表达式来描述我感兴趣的子树。请问有没有办法用lxml来做到这一点?看起来可以使用iterparse()
方法来实现这个功能,但根据文档,它似乎并不会生成我想要的解析对象。有什么建议吗?
(使用lxml并不是必须的,但我想用Python,并且希望速度快一点。)
2 个回答
0
使用迭代解析(Iterparse)时,你还是得先解析到你想要的子树为止。这可能会比较耗时。你可以考虑在把数据送入解析器之前,先用正则表达式提取出你需要的子树,这样可能会更高效。另外,你也可以尝试写一个SAX解析器。虽然SAX解析器可能比lxml慢,但它占用的内存比较少,所以在某些情况下可能会更好。
1
我觉得你可能想要用iterparse。看看这个链接里的“选择性标签事件”部分:http://lxml.de/parsing.html,似乎能满足你的需求:
context = etree.iterparse(xmlfile, tag="yourSubTree")
action, elem = context.next()
etree.iterwalk(elem, ...)...
看起来XPath也可以用,但我猜XPath会先把整个树结构读进来,然后再返回结果,而iterparse应该只会遍历树结构,直到找到匹配的部分。比较这两种方法的性能是值得的。