如何批量修复XML格式错误并使用Python的xml.etree.ElementTree解析
批量修复重复XML声明并解析的解决方案
针对XML文件开头存在重复/不完整XML声明导致解析失败的问题,可通过两种方式解决:临时清理内容后解析(不修改原文件)或者批量修改原文件永久修复。
一、临时清理后解析(不修改原文件)
这种方法在读取文件内容时先清理多余的XML声明,再传递给ElementTree解析,不会改动原文件:
import xml.etree.ElementTree as ET import re import glob def parse_fixed_xml(file_path): # 读取文件内容 with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 移除开头不完整的XML声明及前置内容,保留第一个完整的XML声明 cleaned_content = re.sub(r'^.*?(<\?xml[^>]+?>)', r'\1', content, flags=re.DOTALL) # 若存在多个完整XML声明,仅保留第一个 cleaned_content = re.sub(r'(<\?xml[^>]+?>\s*)+', r'\1', cleaned_content, flags=re.MULTILINE) # 解析清理后的内容 root = ET.fromstring(cleaned_content) return root # 批量处理目录下所有XML文件 for xml_file in glob.glob('*.xml'): print(f"正在处理文件:{xml_file}") root = parse_fixed_xml(xml_file) # 执行原有的解析逻辑 for child in root.iter('count'): print(child.tag, child.attrib)
代码说明:
re.sub(r'^.*?(<\?xml[^>]+?>)', r'\1', content, flags=re.DOTALL):匹配文件开头到第一个完整XML声明(包含?>)的所有内容,替换为保留完整声明,解决示例中开头不完整声明的问题。re.sub(r'(<\?xml[^>]+?>\s*)+', r'\1', cleaned_content, flags=re.MULTILINE):处理存在多个完整XML声明的场景,仅保留第一个。glob.glob('*.xml'):批量匹配当前目录下所有XML文件,可按需修改路径(如'/path/to/xmls/*.xml')。
二、批量修改原文件(永久修复)
如果需要永久修复这些XML文件,可将清理后的内容写回原文件(注意:操作前请备份文件,避免数据丢失):
import re import glob def fix_xml_file(file_path): with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 应用同样的清理规则 cleaned_content = re.sub(r'^.*?(<\?xml[^>]+?>)', r'\1', content, flags=re.DOTALL) cleaned_content = re.sub(r'(<\?xml[^>]+?>\s*)+', r'\1', cleaned_content, flags=re.MULTILINE) # 写回原文件 with open(file_path, 'w', encoding='utf-8') as f: f.write(cleaned_content) # 批量修复所有XML文件 for xml_file in glob.glob('*.xml'): print(f"正在修复文件:{xml_file}") fix_xml_file(xml_file)
注意事项
- 不确定正则匹配效果时,可先对单个文件测试清理后的内容,确认无误后再批量处理。
- 批量修改文件前务必备份,防止因规则错误导致文件损坏。
内容的提问来源于stack exchange,提问作者user16016201
相关产品推荐
相关产品推荐

