Python如何编辑含无效字符的XML文档且保留全部原有字符?
解决方案
一、Python minidom配置方案
minidom底层依赖expat解析器,默认开启XML 1.0字符合法性校验,你可以通过自定义解析器关闭相关校验,保留原始无效字符:
from xml.dom import minidom from xml.parsers import expat def create_permissive_parser(): # 创建自定义expat解析器实例 parser = expat.ParserCreate() parser.returns_unicode = True # 关键配置:开启Foreign DTD模式,跳过字符合法性校验 parser.UseForeignDTD(True) # 保留默认实体映射规则,避免原有实体被错误解析 parser.allowed_entities = {'amp': '&', 'lt': '<', 'gt': '>', 'apos': "'", 'quot': '"'} return parser # 解析文件时传入自定义解析器 with open("你的目标XML文件路径.xml", "rb") as f: dom = minidom.parse(f, parser=create_permissive_parser())
注意事项:
- 该配置可正常识别并保留
等原有控制字符实体,不会触发格式报错 - 输出修改后的文件时,直接调用
dom.toxml()即可保留原有实体格式,无需额外配置
二、minidom不可用时的lxml实现方案
如果minidom的自定义解析器仍无法适配你的文件场景,可以使用lxml库实现解析、遍历、修改全流程,操作更简单,兼容性更强:
解析配置
from lxml import etree # 配置容错解析器 parser = etree.XMLParser( recover=True, # 忽略非法字符报错,尽可能完整还原原始内容 resolve_entities=False, # 禁止自动解析实体,保留` `这类原始写法 encoding="utf-8" ) tree = etree.parse("你的目标XML文件路径.xml", parser=parser) root = tree.getroot()
遍历与修改实现
# 递归遍历XML内所有元素节点,无需手动处理嵌套层级 for elem in root.iter(): # 查看节点标签、当前文本、属性信息 print(f"节点标签: {elem.tag}, 原有文本: {elem.text}, 属性集合: {elem.attrib}") # 修改指定节点文本示例 if elem.tag == "你需要修改的节点标签": elem.text = "修改后的新文本值" # 修改指定节点属性示例 if "目标属性名" in elem.attrib: elem.attrib["目标属性名"] = "修改后的新属性值" # 保存修改后的文件,保留原格式 tree.write( "修改后输出文件路径.xml", encoding="utf-8", xml_declaration=True, pretty_print=False )
内容的提问来源于stack exchange,提问作者Jacob Zimmerman
相关产品推荐
相关产品推荐

