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

Python将XML解析为字典修改后导出XML的格式问题求助

问题原因
  • 第三方库dicttoxml生成的XML节点结构、默认属性规则和原始XML存在差异
  • minidom的toprettyxml()方法默认缩进(制表符/4空格)、换行规则和你的源文件格式不匹配
  • 冗余的文件手动关闭操作(with上下文会自动管理文件句柄,无需手动调用close())
最优解决方案

直接使用xmltodict自带的unparse方法反序列化字典,不需要额外引入dicttoxml和minidom,原生适配xmltodict解析生成的字典结构,更易控制输出格式:

import xmltodict

# 读取并解析XML
with open("books.xml", "r", encoding="utf-8") as xml_file:
    data_dict = xmltodict.parse(xml_file.read())

# 修改目标字段
data_dict['catalog']['book'][0]['author'] = "Test User"

# 直接用xmltodict反序列化为XML,匹配原格式缩进
output_xml = xmltodict.unparse(
    data_dict,
    indent="   ",  # 和原文件缩进一致,3个空格
    newl="\n",     # 换行符匹配原文件
    encoding="utf-8",
    full_document=True  # 保留XML头部声明
)

# 写入文件
with open("newbook.xml", "wb") as f:
    f.write(output_xml)
保留原有dicttoxml写法的适配方案

调整toprettyxml的缩进参数,同时过滤多余空行即可:

import xmltodict
from dicttoxml import dicttoxml
from xml.dom.minidom import parseString

with open("books.xml", "r", encoding="utf-8") as xml_file:
    data_dict = xmltodict.parse(xml_file.read())

data_dict['catalog']['book'][0]['author']="Test User"
xml = dicttoxml(data_dict, attr_type=False, root=False)
dom = parseString(xml)

# 自定义缩进为3个空格,过滤多余空行
pretty_xml = '\n'.join([line for line in dom.toprettyxml(indent="   ", newl="\n").split('\n') if line.strip()])

with open("newbook.xml", "w", encoding="utf-8") as xmlfile:
    xmlfile.write(pretty_xml)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:07