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

如何阻止expat解析器自动替换XML中的实体字符?

解决方案

方法1:关闭实体自动展开(推荐)

Python的expat绑定提供了EnableEntityExpansion开关,默认值为1(开启),会自动将XML中的预定义实体(&、<、>、"、')替换为对应字符。将该开关设为0即可关闭替换逻辑,原有CharacterDataHandler可以直接收到原始未修改的字符串,改动量最小。

代码示例:

def on_character_data(data):
    print(data)

parser = xml.parsers.expat.ParserCreate(encoding=encoding)
# 新增一行配置,关闭实体自动展开
parser.EnableEntityExpansion = 0
parser.CharacterDataHandler = on_character_data
# 后续解析逻辑无需修改
parser.Parse(test_xml_string)

注意事项:如果你的XML中包含自定义实体引用,关闭自动展开后需要自行实现EntityDeclHandler处理逻辑,否则解析器会抛出未定义实体的错误;仅包含XML预定义实体的场景无需额外处理。

方法2:使用DefaultHandler接收原始字符流

如果你需要在其他逻辑中保留实体展开的默认能力,仅在特定场景获取原始文本,可以改用DefaultHandler接收所有未被结构化解析消费的原始内容,包含未解析的实体引用。

代码示例:

def on_default(data):
    # 此处data为原始未解析的文本内容,包含&等原始实体写法
    print(data)

parser = xml.parsers.expat.ParserCreate(encoding=encoding)
# 替换回调为DefaultHandler
parser.DefaultHandler = on_default
parser.Parse(test_xml_string)

注意事项:DefaultHandler会收到标签之外的所有原始内容,包括标签间的空白、注释、处理指令等,需要自行过滤筛选需要的正文内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:09:03