解析XML文件报错是什么原因?如何跳过无效XML文件继续处理?
报错原因说明
xml.etree.ElementTree.ParseError: not well-formed (invalid token) 属于XML格式合法性错误,不一定是文件物理损坏,常见触发原因包括:
- XML文件实际编码和头部声明的编码不匹配,比如声明为UTF-8但实际是GBK编码
- 内容中存在XML1.0不支持的字符,比如未转义的
&/</>特殊符号、控制字符、emoji等 - 标签未闭合、属性引号未配对、内容截断等格式错误
你手动打开文件也报错,说明该文件本身不符合XML规范,属于格式非法的XML文件。
解决方案
方案1:捕获异常跳过非法文件(最稳妥的批量处理方案)
遍历文件时增加异常捕获逻辑,遇到解析失败的文件直接跳过,同时可以记录失败文件清单方便后续排查,示例代码如下:
import os import xml.etree.ElementTree as ET # 你的XML文件存放目录 xml_dir = "C:/data/UserA/Desktop/XML-files" success_count = 0 failed_list = [] for file_name in os.listdir(xml_dir): if not file_name.lower().endswith(".xml"): continue file_path = os.path.join(xml_dir, file_name) try: tree = ET.parse(file_path) # 此处替换为你正常处理XML的业务逻辑 success_count += 1 except ET.ParseError as e: failed_list.append((file_name, str(e))) continue print(f"批量处理完成,成功解析{success_count}个文件,{len(failed_list)}个文件解析失败") if failed_list: print("解析失败文件清单:") for name, err in failed_list: print(f"{name}:{err}")
方案2:使用容错性更高的解析器尽可能修复读取
如果需要尽可能读取内容不规范的XML,可以使用lxml库的解析器,开启修复模式后会自动忽略/修复小的格式错误,兼容性远高于标准库的ElementTree:
- 先安装依赖:
pip install lxml - 示例代码:
from lxml import etree # 开启自动修复模式的解析器 parser = etree.XMLParser(recover=True) file_path = "C:/data/UserA/Desktop/XML-files/file_348.xml" try: tree = etree.parse(file_path, parser=parser) # lxml的etree接口和标准库ElementTree大部分兼容,可直接替换使用 print(tree) except Exception as e: # 损坏过于严重的文件依然会解析失败,此处捕获即可 print(f"{file_path}解析失败:{e}")
问题排查技巧
如果需要修复单个报错文件,可以打开file_348.xml跳转到第62行第48列的位置,检查该位置的字符是否为非法特殊字符,手动转义或删除后即可正常解析。
内容的提问来源于stack exchange,提问作者Andalusia
相关产品推荐
相关产品推荐

