我正在尝试使用本教程的“事件驱动解析”部分中描述的模式。lxml
在我的代码中,我正在调用一个可以使用该iterchildren()
方法在元素上递归运行的函数。我将在这里使用两个嵌套循环进行说明。
这按预期工作:
xml = StringIO("<root><a><b>data</b><c><d/></c></a><a><z/></a></root>")
for ev, elem in etree.iterparse(xml):
if elem.tag == 'a':
for c in elem.iterchildren():
for gc in c.iterchildren():
print gc
输出是<Element d at 0x2df49b0>
。
但如果我.clear()
最后添加:
for ev, elem in etree.iterparse(xml):
if elem.tag == 'a':
for c in elem.iterchildren():
for gc in c.iterchildren():
print gc
elem.clear()
-- 它不打印任何东西。为什么会这样,我该怎么做才能解决这个问题?
笔记:
- 我可以跳过
iterchildren
并执行for c in elem
orfor c in list(elem)
,效果相同。 - 我需要使用迭代方法来保持低内存使用率。
在实际用例中,我正在使用属性进行元素查找:
if elem.attrib.get('id') == elem_id: return _get_info(elem)
我想解释一下如何clear
在处理内部元素之前设法擦除它们,以及如何在需要处理祖先时将它们保存在内存中。