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

如何解决xml.dom.minidom解析含特殊字符XML的格式错误问题

解决XML解析时的ExpatError:未转义特殊字符问题

这个报错的原因很清晰:你的XML文件里包含了不符合规范的未转义特殊字符(比如<FromName>节点里的&),而xml.dom.minidom依赖的expat解析器对XML格式要求非常严格,遇到这类非法字符就会直接抛出解析错误。

下面给你几个实用的修复方案,按落地优先级排序:

方案1:预处理XML内容,修复未转义字符

如果你没法修改生成XML的源头,可以先读取文件内容,替换掉未转义的特殊字符,再交给解析器处理。这里要注意避免重复转义已经合规的实体(比如不要把&amp;改成&amp;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('&amp;', xml_content)
    fixed_content = fixed_content.replace('<', '&lt;')\
                                 .replace('>', '&gt;')\
                                 .replace('"', '&quot;')\
                                 .replace("'", '&apos;')
    
    # 用修复后的内容解析
    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('&', '&amp;')
    text = text.replace('<', '&lt;')
    text = text.replace('>', '&gt;')
    text = text.replace('"', '&quot;')
    text = text.replace("'", '&apos;')
    return text

把要写入XML的文本先经过这个函数处理,就能生成完全符合规范的XML,后续解析再也不会出现类似报错。


内容的提问来源于stack exchange,提问作者Sachin Salve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:44:28