如何阻止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
相关产品推荐
相关产品推荐

