如何解决xml.dom.minidom解析含特殊字符XML的格式错误问题
解决XML解析时的ExpatError:未转义特殊字符问题
这个报错的原因很清晰:你的XML文件里包含了不符合规范的未转义特殊字符(比如<FromName>节点里的&),而xml.dom.minidom依赖的expat解析器对XML格式要求非常严格,遇到这类非法字符就会直接抛出解析错误。
下面给你几个实用的修复方案,按落地优先级排序:
方案1:预处理XML内容,修复未转义字符
如果你没法修改生成XML的源头,可以先读取文件内容,替换掉未转义的特殊字符,再交给解析器处理。这里要注意避免重复转义已经合规的实体(比如不要把&改成&amp;),可以用正则精准匹配:
from xml.dom.minidom import parseString import os import glob import re path = r'C:\Users\sachin\Desktop\xmlwatcher' # 匹配不在合法实体引用中的&符号 unescaped_amp_pattern = re.compile(r'&(?!amp;|lt;|gt;|quot;|apos;)') for xml_file in glob.glob(os.path.join(path, '*.xml')): with open(xml_file, 'r', encoding='utf-8') as f: xml_content = f.read() # 修复未转义的&,再处理其他特殊字符 fixed_content = unescaped_amp_pattern.sub('&', xml_content) fixed_content = fixed_content.replace('<', '<')\ .replace('>', '>')\ .replace('"', '"')\ .replace("'", ''') # 用修复后的内容解析 xmldoc = parseString(fixed_content) subject = xmldoc.getElementsByTagName('FromName')[0].firstChild.data print(subject)
方案2:用支持容错解析的库(推荐)
xml.dom.minidom的严格性有时候会限制场景,换成lxml库会更灵活——它支持恢复模式,能自动处理多种XML格式错误(包括未转义的特殊字符):
先安装lxml:
pip install lxml
然后修改你的脚本:
from lxml import etree import os import glob path = r'C:\Users\sachin\Desktop\xmlwatcher' # 创建启用恢复模式的解析器 parser = etree.XMLParser(recover=True) for xml_file in glob.glob(os.path.join(path, '*.xml')): tree = etree.parse(xml_file, parser) # 直接获取节点文本,语法比minidom更简洁 subject = tree.findtext('FromName') print(subject)
这个方案代码更简洁,还能处理更多潜在的XML格式问题,适合无法控制XML生成流程的场景。
方案3:从源头修复XML格式(最优解)
如果能修改生成这个XML的程序,确保写入文本时自动转义特殊字符,这是最根本的解决办法。比如添加一个转义函数,处理所有XML特殊字符:
def escape_xml_text(text): if not text: return text text = text.replace('&', '&') text = text.replace('<', '<') text = text.replace('>', '>') text = text.replace('"', '"') text = text.replace("'", ''') return text
把要写入XML的文本先经过这个函数处理,就能生成完全符合规范的XML,后续解析再也不会出现类似报错。
内容的提问来源于stack exchange,提问作者Sachin Salve
相关产品推荐
相关产品推荐

