gpt4 book ai didi

python - lxml iterparse 缺少子节点

转载 作者:行者123 更新时间:2023-12-04 06:07:53 25 4
gpt4 key购买 nike

我正在使用 lxml iterparse 来读取巨大的 xml 文件。对于给定的 mainElement,我检查子元素并处理每个子元素。但我注意到,在检查元素中的子节点时,解析器有时实际上会丢失一些子节点。我什至打印了每个元素的长度,对于给定的元素标签,它应该是一个常数,但有时它比它应该的要小。令人惊讶的是,这通常发生在第 5 个 block (一个 block => mainElement 发生)。解析器应该错过子节点的原因是什么?有什么线索吗?

示例代码-

from lxml import etree  
def parseXml(context,attribList,elemList,mainElement):
for event, element in context:
if element.tag == mainElement and event=='start':
for child in element:
if child.tag in elemList:
print len(child) #for a given child,the len should be constant
#do things
elif event=='end':
element.clear()

谢谢!

最佳答案

定义上下文时,请务必将参数 events 设置为 ('end',) 而不是 ('start',)。否则,您可能会得到您所描述的行为。

context=etree.iterparse(filehandle, events=('end',), tag=mainElement)

我认为问题在于 lxml 在一个线程中处理 XML,而在另一个线程中运行 parseXml,因此您可以在 parseXml< 中到达 start 元素 在 lxml 完成解析到相应的 end 元素之前。因此,当您遍历该元素的子元素时,您只会得到部分结果。


顺便说一下,this article提供了一种很好的组织方式,专为处理非常大的 XML 而设计:

def fast_iter(context, func, *args, **kwargs):
# http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
# Author: Liza Daly
for event, elem in context:
func(elem, *args, **kwargs)
elem.clear()
while elem.getprevious() is not None:
del elem.getparent()[0]
del context

def parseXml(element,attribList,elemList):
for child in element:
if child.tag in elemList:
print len(child) #for a given child,the len should be constant
#do things

context=etree.iterparse(filehandle, events=('end',), tag=mainElement)
fast_iter(context, parseXml, attribList, elemList)

关于python - lxml iterparse 缺少子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8129329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com