lxml iterparse错误的子节点

2024-10-04 03:27:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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() 

谢谢!在


Tags: ineventchild解析器元素forif节点
1条回答
网友
1楼 · 发布于 2024-10-04 03:27:55

定义上下文时,请确保将参数events设置为('end',),而不是('start',)。否则,你可以得到你所描述的行为。在

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

我认为问题是,lxml在一个线程中处理XML,而在另一个线程中运行parseXml,所以在lxml完成对相应的end元素的解析之前,可以到达start中的start元素。所以当你循环元素的子元素时,你只得到部分结果。在


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

^{pr2}$

相关问题 更多 >