Вы можете проверить, должен ли элемент удаляться периодически - если он содержит хотя бы одного «неустранимого» дочернего элемента, он не должен.
dontRemove = ['xxx','yyy']
elements_to_remove = []
def should_not_be_removed(parent):
if parent.tag in dontRemove:
return True
nonremovable_child_found = False
for child in parent:
if should_not_be_removed(child):
nonremovable_child_found = True
if not nonremovable_child_found:
elements_to_remove.append(parent)
return nonremovable_child_found
should_not_be_removed(root)
После этого повторяющиеся вызовы, начинающиеся с root elements_to_remove
, содержат список элементов, которые не содержат дочерний элемент с тегом, указанным в dont remove
Я также расширил ваш xml, чтобы охватить больше тестовых случаев, проверьте, что вы имели в виду:
<node1>
<xxx>
don't remove
</xxx>
<subnode2>
<yyy>
don't remove
</yyy>
</subnode2>
<subnode3>
remove
</subnode3>
<subnode4>
<xxx>
don't remove
</xxx>
<abc>
remove
</abc>
</subnode4>
</node1>