【问题标题】:Why invoking ElementTree.parse function twice in one script will get an exception?为什么在一个脚本中两次调用 ElementTree.parse 函数会出现异常?
【发布时间】:2015-03-23 12:33:51
【问题描述】:

我需要在一个脚本中处理两个 xml 文件。 所以,我写了一些如下代码:

import xml.etree.cElementTree as ET

parser = ET.XMLParser(encoding='utf-8')
ET.parse('../wiki.xml', parser=parser)
ET.parse('../tutorial.xml', parser=parser)

但是,第二次调用parse 出现异常。

cElementTree.ParseError: parsing finished

但是,我确保两个 xml 文件都没有内部问题,因为当我更改顺序时,第二次调用总是出现异常,如果我保留了一个,则没有问题。

那么,为什么在一个脚本中两次调用 ElementTree.parse 函数会出现异常?

【问题讨论】:

    标签: python xml parsing elementtree


    【解决方案1】:

    您应该为每棵树创建新的解析器。因为解析器内部保存着解析后的状态,所以它不能用来解析另一棵树。

    import xml.etree.cElementTree as ET
    
    parser1 = ET.XMLParser(encoding='utf-8')
    ET.parse('../wiki.xml', parser=parser1)
    parser2 = ET.XMLParser(encoding='utf-8')
    ET.parse('../tutorial.xml', parser=parser2)
    

    【讨论】:

    • 这个解决方案是对的,谢谢!但是,现有的一种方法是否可以清除解析器的状态?
    • 来自documentation 我没有看到。您可以尝试使用close() 方法,但我不确定它是否会成功。
    【解决方案2】:

    您也可以在构建下一棵树之前删除每一棵树:

    import xml.etree.ElementTree as ET
    ...
    for xml_file in xml_files:
        tree = ET.parse(xml_file)
        root = tree.getroot()
        analyze_one_file(root)
        del root
        del tree
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      相关资源
      最近更新 更多