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
相关产品推荐
相关产品推荐

