使用ElementTree移除XML的value元素后格式错乱,如何修复?
问题描述
想要移除XML中的<value>元素,但执行移除操作后,原位置的</type>闭合标签上移,导致格式错乱,希望删除目标行后保持XML格式缩进正确。
原XML代码
<type> <child name="someName" /> <value name="Tier4" /> </type>
原Python代码
for value in type.findall('./value'): if value.get('name') == 'Tier4': type.remove(value)
执行后异常XML格式
<type> <child name="someName" /> </type>
解决方法
方法1:用lxml库维护缩进格式
标准库xml.etree.ElementTree不支持保留原始缩进,用lxml库可以更好地处理XML格式:
- 先安装依赖:
pip install lxml
- 修改代码(注意变量名别用
type,避免和Python内置函数冲突):
from lxml import etree # 加载XML文件(也可加载字符串) tree = etree.parse("你的XML文件路径.xml") root = tree.getroot() # 定位目标type元素 type_elem = root.find(".//type") for value in type_elem.findall("./value"): if value.get("name") == "Tier4": type_elem.remove(value) # 保存时启用格式化缩进 tree.write( "输出文件路径.xml", encoding="utf-8", pretty_print=True, xml_declaration=True )
处理后输出的XML会自动调整缩进,格式恢复正常:
<type> <child name="someName" /> </type>
方法2:标准库手动实现缩进(无需第三方依赖)
如果不想安装额外库,可以通过自定义函数调整元素的text和tail属性来生成正确缩进:
import xml.etree.ElementTree as ET def indent(elem, level=0): indent_str = "\n" + level * " " if len(elem): if not elem.text or not elem.text.strip(): elem.text = indent_str + " " if not elem.tail or not elem.tail.strip(): elem.tail = indent_str for child in elem: indent(child, level + 1) if not child.tail or not child.tail.strip(): child.tail = indent_str else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = indent_str # 加载XML tree = ET.parse("你的XML文件路径.xml") root = tree.getroot() # 移除目标元素 type_elem = root.find(".//type") for value in type_elem.findall("./value"): if value.get("name") == "Tier4": type_elem.remove(value) # 应用缩进规则 indent(root) # 保存文件 tree.write("输出文件路径.xml", encoding="utf-8", xml_declaration=True)
内容的提问来源于stack exchange,提问作者talkinggoat
相关产品推荐
相关产品推荐

