使用Python的tree.write()保存XML结构时如何格式化树形输出?
问题:Python修改XML后元素无树形结构显示
我想要使用Python向XML文件中添加Element及Subelements,但修改后的文件中元素和子元素显示为一行,而非树形结构。我的代码如下:
import xml.etree.ElementTree as ET tree = ET.parse('existing_file.xml') root = tree.getroot() new_object = ET.SubElement(root, 'object') name = ET.SubElement(new_object, 'name') name.text = 'car' color = ET.SubElement(new_object, 'color') color.text = 'Red' new_tree = ET.ElementTree(root) new_tree.write('new_file.xml')
执行后得到的文件内容无结构,如下:
<object><name>car</name><color>red</color></object>
但我需要的是树形结构:
<object> <name>car</name> <color>red</color> </object>
请问我哪里操作出错了?
解决方案
你没写错逻辑,只是ElementTree.write()方法默认输出紧凑格式的XML,不会自动添加缩进和换行。要输出树形结构,分两种情况处理:
情况1:Python 3.9及以上版本
Python 3.9开始,xml.etree.ElementTree新增了indent()方法,可以直接给XML元素添加缩进:
import xml.etree.ElementTree as ET tree = ET.parse('existing_file.xml') root = tree.getroot() new_object = ET.SubElement(root, 'object') name = ET.SubElement(new_object, 'name') name.text = 'car' color = ET.SubElement(new_object, 'color') color.text = 'Red' # 给XML元素添加缩进 ET.indent(root, space=" ", level=0) # 写入文件,指定编码和XML声明(可选) tree.write('new_file.xml', encoding='utf-8', xml_declaration=True)
space:定义缩进的空格数,可替换为"\t"使用制表符缩进encoding='utf-8'和xml_declaration=True:可选参数,用于指定文件编码并生成XML声明头
情况2:兼容Python 3.8及以下版本
旧版本ElementTree没有内置缩进方法,可借助xml.dom.minidom实现美化输出:
import xml.etree.ElementTree as ET import xml.dom.minidom tree = ET.parse('existing_file.xml') root = tree.getroot() new_object = ET.SubElement(root, 'object') name = ET.SubElement(new_object, 'name') name.text = 'car' color = ET.SubElement(new_object, 'color') color.text = 'Red' # 将ElementTree对象转换为minidom格式并美化 rough_string = ET.tostring(root, 'utf-8') reparsed = xml.dom.minidom.parseString(rough_string) pretty_xml = reparsed.toprettyxml(indent=" ") # 写入文件 with open('new_file.xml', 'w', encoding='utf-8') as f: f.write(pretty_xml)
这样输出的XML就会呈现你需要的树形结构。
内容的提问来源于stack exchange,提问作者Bobcat Chemist
相关产品推荐
相关产品推荐

