我正在从一个大的 xml 文件中获取信息,并且我正在使用 python lxml target parsing interface去做吧。我希望能够设置一个限制,之后解析就会停止。这是一些代码:
解析器目标代码:
class TitleTarget(object):
def __init__(self, limit=None):
self.limit = limit
self.counter = 0
def start(self, tag, attrib):
if self.limit and self.counter > self.limit:
#### BREAK HERE ####
return False
#doProcessing(attrib)
self.counter = self.counter + 1
def end(self, tag):
pass
def data(self, data):
pass
def close(self):
pass
启动解析的代码:
parser = etree.XMLParser(target = TitleTarget(limit))
etree.parse(file, parser)
我知道处理会转到“BREAK HERE”行,但我还没有找到任何方法来停止解析。我尝试过返回 True、False、[] 并引发错误,但似乎都不起作用。它始终处理直到文件结束。
有没有办法停止使用此方法的处理。
最佳答案
您可以循环遍历 file
中的行并调用 parser.feed
,而不是使用 etree.parse(file, parser)
每行。这使您可以控制何时跳出循环。
现在您只需在目标中设置 self.done=True
,并在 feed 循环中测试 target.done
即可:
import lxml.etree as ET
class HaltingTarget(object):
def __init__(self, limit=None):
self.done=False
self.limit=limit
self.counter=0
self.result=[]
def start(self, tag, attrib):
if self.limit and self.counter>self.limit:
self.done=True
return
if attrib:
self.result.append(attrib)
self.counter+=1
def end(self, tag):
pass
def data(self, data):
pass
def comment(self, text):
pass
def close(self):
return
def halt_parser():
content='''\
<node1>
<Title a1="x1"> My Title </Title>
<node2 a1="x2"> ... </node2>
<node2 a1="x1"> ... </node2>
</node1>
'''
target=HaltingTarget()
parser=ET.XMLParser(target=target)
for line in content.splitlines():
parser.feed(line.strip())
if target.done: break
# We can't call parser.close() since the XML we've fed it is probably
# incomplete. We don't plan to use `parser` anymore, so delete it.
del parser
print(target.result)
# [{'a1': u'x1'}, {'a1': u'x2'}, {'a1': u'x1'}]
关于python - 是否可以使用lxml目标解析接口(interface)在中间中断解析大型xml文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8010683/