我使用lxml iterparse来读取巨大的xml文件。对于给定的mainElement,我检查子元素并处理每个子元素。但是我注意到,在检查元素中的子节点时,解析器实际上有时会丢失一些子节点。我甚至打印了每个元素的长度,对于一个给定的元素标签来说,它应该是一个常量,但是有时候它比它应该的要小。令人惊讶的是,这种情况通常发生在第五个区块(一个区块=>;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',)
。否则,你可以得到你所描述的行为。在我认为问题是,lxml在一个线程中处理XML,而在另一个线程中运行
parseXml
,所以在lxml完成对相应的end
元素的解析之前,可以到达start
中的start
元素。所以当你循环元素的子元素时,你只得到部分结果。在顺便说一句,this article提供了一种很好的组织方式,专为处理非常大的XML而设计:
^{pr2}$相关问题 更多 >
编程相关推荐