使用Python ElementTree批量解析XML出现ParseError该如何解决?
错误原因
ParseError: XML or text declaration not at start of entity: line 2, column 0 报错的核心原因是XML文件的声明(即<?xml version="1.0" encoding="xxx"?>这行内容)没有出现在文件的最起始位置,前面存在多余字符,常见诱因包括:
- XML第一行开头有空格、换行、制表符等空白字符
- 文件是UTF-8带BOM编码格式,读取时BOM头(不可见的
\ufeff字符)被当做文件第一个内容,挤到了XML声明的前面 - 文件开头有其他多余的注释、文本内容
修复方案
1. 代码优化+适配异常场景
你原有代码存在逻辑、缩进问题,同时增加编码适配、内容预处理逻辑,修改后代码如下:
import xml.etree.ElementTree as ET import os utterances = [] # 直接遍历xml文件列表,不要转字符串再拆分,避免文件名带空格时出错 xml_files = [x for x in os.listdir() if x.endswith('.xml')] for filename in xml_files: # 用utf-8-sig编码自动识别并跳过UTF-8 BOM头 with open(filename, 'r', encoding="utf-8-sig") as f: content = f.read() # 去除内容开头的所有空白字符,避免XML声明前有空格换行 content = content.lstrip() # 从字符串解析XML root = ET.fromstring(content) for y in root.iter('UNIT'): utterances.append(y.text)
2. 批量修复异常XML文件
如果部分XML文件开头确实存在非空白的多余内容,可以增加预处理逻辑截断到XML声明起始位置,在读取content后增加如下代码即可:
# 找到<?xml声明的起始位置,截断前面的所有内容 xml_start = content.find('<?xml') if xml_start != -1: content = content[xml_start:]
内容的提问来源于stack exchange,提问作者user14753120
相关产品推荐
相关产品推荐

