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

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())

注意事项:

  • 该配置可正常识别并保留&#10;等原有控制字符实体,不会触发格式报错
  • 输出修改后的文件时,直接调用dom.toxml()即可保留原有实体格式,无需额外配置

二、minidom不可用时的lxml实现方案

如果minidom的自定义解析器仍无法适配你的文件场景,可以使用lxml库实现解析、遍历、修改全流程,操作更简单,兼容性更强:

解析配置

from lxml import etree

# 配置容错解析器
parser = etree.XMLParser(
    recover=True,  # 忽略非法字符报错,尽可能完整还原原始内容
    resolve_entities=False,  # 禁止自动解析实体,保留`&#10;`这类原始写法
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:54:03