使用ElementTree迭代字典追加XML元素时如何实现换行显示
解决XML追加元素后换行排版问题
方法1:用Python 3.9+自带的ElementTree indent方法
Python 3.9及以上版本的xml.etree.ElementTree新增了indent()方法,专门用来给XML添加缩进和换行,直接在写入文件前调用即可:
import xml.etree.ElementTree as ET myDict = [{"name": "dan", "age": "25", "subject":"maths"}, {"name": "susan", "age": "27", "subject":"english"}, {"name": "leo", "age": "24", "subject":"psychology"}] tree = ET.parse('<path to existing .xml>') root = tree.getroot() for item in myDict: root.append(ET.Element("student", attrib=item)) # 给XML树添加缩进和换行 ET.indent(root, space=" ", level=0) tree.write('<path to .xml>', encoding='utf-8', xml_declaration=True)
space参数指定缩进用的字符(比如两个空格)level控制起始缩进级别
方法2:正确使用lxml实现格式化
你之前用lxml没生效,大概率是没有用lxml的完整流程操作,比如混用了标准库的ElementTree和lxml。改用lxml的API重新实现:
from lxml import etree myDict = [{"name": "dan", "age": "25", "subject":"maths"}, {"name": "susan", "age": "27", "subject":"english"}, {"name": "leo", "age": "24", "subject":"psychology"}] # 用lxml的parser读取现有XML,保留原有结构 parser = etree.XMLParser(remove_blank_text=True) tree = etree.parse('<path to existing .xml>', parser) root = tree.getroot() for item in myDict: # 用lxml创建元素 student = etree.Element("student", attrib=item) root.append(student) # 写入时开启pretty_print tree.write('<path to .xml>', encoding='utf-8', xml_declaration=True, pretty_print=True)
remove_blank_text=True是关键,它会清理XML中的空白文本节点,让pretty_print能正确生效- 必须全程用lxml的API(解析、创建元素),不能和标准库ET混用
方法3:兼容低版本Python的手动换行(Python<3.9)
如果你的Python版本低于3.9,没法用ET.indent(),可以手动在每个新元素前后添加换行文本节点:
import xml.etree.ElementTree as ET myDict = [{"name": "dan", "age": "25", "subject":"maths"}, {"name": "susan", "age": "27", "subject":"english"}, {"name": "leo", "age": "24", "subject":"psychology"}] tree = ET.parse('<path to existing .xml>') root = tree.getroot() # 先给root末尾加一个换行(如果原XML末尾没有的话) root.append(ET.Text('\n ')) for idx, item in enumerate(myDict): student = ET.Element("student", attrib=item) root.append(student) # 最后一个元素后不加多余换行 if idx != len(myDict)-1: root.append(ET.Text('\n ')) # 写入时指定编码,避免乱码 tree.write('<path to .xml>', encoding='utf-8', xml_declaration=True)
这种方法需要手动控制缩进的空格数,适合低版本环境临时用。
内容的提问来源于stack exchange,提问作者r0bt
相关产品推荐
相关产品推荐

