lxml:调用etree.iterparse(f)时获取文件当前行号

时间:2013-08-12 17:18:56

标签: python parsing lxml

由于没有人回复或评论这篇文章,我决定重写这篇文章。

使用lxml考虑以下Python代码:

treeIter = etree.iterparse(fObj)
for event, ele in treeIter:
    if ele.tag == 'logRoot':
        try:
            somefunction(ele)
        except InternalException as e:
            e.handle(*args)
    ele.clear()

InternalException是用户定义的,除了lxml.etree.XMLSyntaxError之外,还包装来自somefunction()的所有异常。 InternalException具有明确定义的处理函数.handle()。

fObj将“trueRoot”作为顶级标记,将许多“logRoot”作为第二级标记。

我的问题是:在处理异常e时,有没有办法记录当前行号? * args可以被任何可用的参数替换。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:2)

import lxml.etree as ET
import io

def div(x):
    return 1/x

content = '''\
    <trueRoot>
      <logRoot a1="x1"> 2 </logRoot>
      <logRoot a1="x1"> 1 </logRoot>
      <logRoot a1="x1"> 0 </logRoot>            
    </trueRoot>
    '''
for event, elem in ET.iterparse(io.BytesIO(content), events=('end', ), tag='logRoot'):
    num = int(elem.text)
    print('Calling div({})'.format(num))
    try:
        div(num)
    except ZeroDivisionError as e:
        print('Ack! ZeroDivisionError on line {}'.format(elem.sourceline))

打印

Calling div(2)
Calling div(1)
Calling div(0)
Ack! ZeroDivisionError on line 4