【问题标题】:Cannot parse XML files in Python - xml.etree.ElementTree.ParseError无法在 Python 中解析 XML 文件 - xml.etree.ElementTree.ParseError
【发布时间】:2021-09-09 23:00:59
【问题描述】:

我正在尝试使用 Python 的 xml 模块从 XML 文件中解析信息。问题是,当我指定文件列表并开始解析策略时,在(假设)成功解析第一个文件后,我收到以下错误:

Parsing 20586908.xml ..
Parsing 20586934.xml ..


Traceback (most recent call last):
  File "<ipython-input-72-0efdae22e237>", line 11, in parse
    xmlTree = ET.parse(xmlFilePath, parser = self.parser)
  File "C:\Users\StefanCepa995\miniconda3\envs\dl4cv\lib\xml\etree\ElementTree.py", line 1202, in parse
    tree.parse(source, parser)
  File "C:\Users\StefanCepa995\miniconda3\envs\dl4cv\lib\xml\etree\ElementTree.py", line 601, in parse
    parser.feed(data)
xml.etree.ElementTree.ParseError: parsing finished: line 1755, column 0

这是我用来解析 XML 文件的代码:

class INBreastXMLParser:
    def __init__(self, xmlRootDir):
        self.parser         = ET.XMLParser(encoding="utf-8")
        self.xmlAnnotations = [os.path.join(root, f)
                                   for root, dirs, files in os.walk(xmlRootDir)
                                              for f in files if f.endswith('.xml')]
    def parse(self):
        for xmlFilePath in self.xmlAnnotations:
            logger.info(f"Parsing {os.path.basename(xmlFilePath)} ..")
            try:
                xmlTree = ET.parse(xmlFilePath, parser = self.parser)
                root    = xmlTree.getroot()
            except Exception as err:
                logging.error(f"Could not parse {xmlFilePath}. Reason - {err}")
                traceback.print_exc()
                

这里是文件解析失败部分的截图:

【问题讨论】:

    标签: python xml xml-parsing elementtree


    【解决方案1】:

    问题是ET.XMLParser 实例被重用了。 ElementTree does not support this 使用的底层 XML 库(Expat):

    由于 pyexpat 使用的 Expat 库的限制,返回的 xmlparser 实例只能用于解析单个 XML 文档。为每个文档调用 ParserCreate 以提供唯一的解析器实例。

    您需要为每个 XML 文件创建一个新的解析器。移动

    self.parser = ET.XMLParser(encoding="utf-8") 
    

    __init__ 方法到parse 方法。

    【讨论】:

    • 这正是问题所在。谢谢!
    【解决方案2】:

    解析错误可能而且确实会发生。他们只有一个原因:解析器错误。即使这只是一个原因,原因也可能很多。三种常见的:

    • 输入无效(例如,您的示例中的 XML 无效)
    • 解析器不兼容(例如,XML 输入有效,但(编码)为解析器无法处理的形式或变体)
    • 解析器本身有错误(例如软件错误)

    由于您使用的解析器是用软件编写的,并且通常每约 173 行代码中都有一个错误,因此值得快速查看一下。

    但前提是您可以快速查看。这可能不值得,因为更多时候问题出在输入上。所以也许值得先研究一下。

    无论如何,你是幸运的。似乎您想要处理 XML 并且存在工具!检查磁盘上文件的验证,您的程序已经提示您它可能因解析错误而无效。

    同时将其移出该目录并再次启动您的脚本。它可能不是唯一无效的文件,您可能还想尽快找出剩余文件中有多少会导致脚本出现问题。

    【讨论】:

    • 所以第三个子弹就是那时。
    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多