如何处理XML解析器编码问题,解决&符号引发的XML解析报错?
问题原因
XML规范中&属于预定义的特殊字符,必须转义为&才属于合法语法,你的XML文件第62行直接使用了未转义的&,严格遵循XML规范的ElementTree解析时会直接抛出非法字符错误。
解决方案
方案1:修改XML源文件(最推荐)
直接把第62行的Blue & Logistics B.V.修改为Blue & Logistics B.V.即可,这是最符合XML规范的解决方式,不会带来其他潜在问题。
你也可以批量校验整个XML文件里的所有未转义特殊字符,除&外,<、>、"、'也属于XML预定义特殊字符,需要对应转义为<、>、"、'。
方案2:读取内容后预处理(无法修改源文件时使用)
如果没有权限修改XML源文件,可以在读取内容后、传入解析器之前,用正则匹配替换所有未转义的&,注意不能直接全局替换所有&,避免把原本已经正确转义的实体(比如<)改错:
import xml.etree.ElementTree as ET import io import re file_path = r'c:\data\MSM\Energy\XML-files\my_xml.xml' with io.open(file_path, 'r', encoding='utf-8-sig') as f: contents = f.read() # 仅替换未转义的&,不影响已存在的合法XML实体 contents = re.sub(r'&(?!#?[a-zA-Z0-9]+;)', '&', contents) tree = ET.fromstring(contents)
方案3:使用容错性更高的解析库
如果你的XML文件存在多处格式不规范问题,建议使用lxml库的XML解析器,开启恢复模式后可以自动修复这类简单的格式错误:
首先安装依赖:pip install lxml
然后修改代码如下:
from lxml import etree file_path = r'c:\data\MSM\Energy\XML-files\my_xml.xml' # 开启自动修复模式 parser = etree.XMLParser(recover=True, encoding='utf-8-sig') tree = etree.parse(file_path, parser=parser)
内容的提问来源于stack exchange,提问作者Al-Andalus
相关产品推荐
相关产品推荐

