python - 是否可以使用lxml目标解析接口(interface)在中间中断解析大型xml文件?

标签 python xml lxml

我正在从一个大的 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/

相关文章:

python - 将函数应用于多索引多列数据帧的 Pythonic 方法是什么?

python - 匹配python正则表达式中的括号

android - 如何更改SwitchCompat的字体系列?

python - 对是否使用 XPath 感到困惑

Python 错误 : 'utf8' codec can't decode byte 0x92 in position 85: invalid start byte

python - 如何使用 scons 构建任意食谱?

python - 数据框将数据移动到随机列中?

android - 如何在 Android 中创建弹出菜单

c# - XDocument 通过其名称属性的值获取 XML 元素

Python 没有捕获 XMLSyntaxError