You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析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:

  1. 先安装依赖:pip install lxml
  2. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:24:02