Python xml.etree.ElementTree复制追加标签时闭合标签错位问题
问题排查:Python ElementTree追加XML节点标签错位问题
示例输入XML
<Document> <tagap> <taga> <taga1>vala1</taga1> <taga2>vala2</taga2> </taga> </tagap> <tagb> <tagb1>valb1</tagb1> <tagb2>valb2</tagb2> </tagb> </Document>
需求:将taga标签多次追加到XML结构中。
异常复现代码
原有代码可运行,但输出的XML中第一个taga标签闭合位置错位:
import xml.etree.ElementTree as ET import copy tree = ET.parse('test.xml') root=tree.getroot() print (root.tag) node=root.find('taga') taga2 = copy.copy(node) print(taga2.tag) node.append(taga2) node.append(taga2) node.append(taga2) tree.write("out_test.xml")
异常输出示例
输出XML结构错乱,首个taga闭合标签位置错误,存在多余闭合标签:
<Document> <taga> <taga1>vala1</taga1> <taga2>vala2</taga2> <taga> <taga1>vala1</taga1> <taga2>vala2</taga2> </taga> <taga> <taga1>vala1</taga1> <taga2>vala2</taga2> </taga> <taga> <taga1>vala1</taga1> <taga2>vala2</taga2> </taga> </taga> <tagb> <tagb1>valb1</tagb1> <tagb2>valb2</tagb2> </tagb> </Document>
问题根因
- 追加层级错误:代码定位到
taga节点后,调用的是taga自身的append()方法,相当于把新taga节点插入到原taga节点内部作为子元素,而非作为平级节点追加到taga的父节点下,直接导致标签嵌套逻辑错误。 - 同一节点重复挂载:三次
append操作传入的是同一个taga2实例,xml.etree.ElementTree规定单个Element对象同一时间只能存在一个父节点,重复挂载同一个实例会打乱整个节点树的父子关联关系,最终生成错位的多余闭合标签。 - 拷贝方式错误:
copy.copy()是浅拷贝,生成的新节点和原节点共享子元素、属性的内存引用,后续修改容易出现非预期的联动问题,应该使用深拷贝生成完全独立的节点副本。 - 节点查找路径错误:示例XML中
taga是tagap的子节点,并非根节点Document的直接子节点,直接调用root.find('taga')无法匹配到目标节点。
正确实现代码
修正上述问题后,代码如下:
import xml.etree.ElementTree as ET import copy tree = ET.parse('test.xml') root = tree.getroot() # 先定位到taga的父节点tagap,再找到待复制的源taga节点 tagap_parent = root.find('tagap') source_taga = tagap_parent.find('taga') # 按需追加多次,每次追加前生成独立的深拷贝节点,挂载到父节点tagap下 append_count = 3 for _ in range(append_count): new_taga = copy.deepcopy(source_taga) tagap_parent.append(new_taga) # 写入文件,指定编码避免乱码 tree.write("out_test.xml", encoding="utf-8")
运行后生成的XML结构正常,所有taga节点为tagap下的平级子节点,标签闭合位置完全正确,无结构错乱问题。
内容的提问来源于stack exchange,提问作者cobp
相关产品推荐
相关产品推荐

