这是一个超级简单的
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
delete = False
for child in root:
if delete:
root.remove(child)
continue
if child.getchildren():
delete = True
我想要的是保留第一个孩子,并删除所有后续的孩子。
但这里只删除了"交替"元素。
对于正常序列,我们可以使用
for child in root[:]:
或者在物体的情况下,我们可以使用
from copy import deepcopy
for child in deepcopy(root):
但如果我这样做,我不会得到"root"的子实例,而是副本的唯一子实例,所以我不能用它来删除root的子实例。
有什么想法吗?
PS:我使用child.getchildren()
是因为我需要保留第一个有自己孩子的孩子。
编辑
受Ashalynd下面评论的启发,我尝试了简单的切片
for child in root[:]:
它奏效了。我一直认为,由于root
是一个实例,所以切片不起作用。
但现在我想知道为什么以下内容不起作用?
from copy import copy
for child in copy(root):
由于浅拷贝本质上是在对自身进行切片。
如果您需要在某一点后停止:
for i, child in enumerate(root):
if child.getchildren():
pruned_children = root[:i]
break
然后从那时起只使用pruned_children
。