2011-11-04 34 views
1

我正在從一個大的XML文件中獲取信息,我正在使用Python來執行lxml target parsing interface。我希望能夠在解析停止後設置一個限制。下面是一些代碼:是否有可能中斷使用lxml目標解析接口解析中間的大型xml文件?

分析器目標代碼:

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, [], and raising Error,似乎沒有工作。它始終處理,直到文件結束。

有沒有辦法停止使用此方法處理BU。

回答

1

而不是使用etree.parse(file, parser),您可以遍歷file的行並在每行上調用parser.feed。這使您可以控制何時跳出循環。

現在,您可以只設置在目標上的self.done=True,並測試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'}] 
+0

感謝的。你的建議對我很好。 – Lycha