Я знаю, что это старая тема, но она продолжала появляться, пока я пытался найти аналогичную задачу.Мне не понравился принятый ответ по двум причинам:
1) Он не обрабатывает несколько вложенных уровней тегов.
2) Он сломается, если несколько тегов XML будут удалены в одном и том жеуровень один за другим.Поскольку каждый элемент имеет индекс Element._children
, вы не должны удалять его при итерации вперед.
Я думаю, что лучшее, более универсальное решение заключается в следующем:
import xml.etree.ElementTree as et
file = 'test.xml'
tree = et.parse(file)
root = tree.getroot()
def iterator(parents, nested=False):
for child in reversed(parents):
if nested:
if len(child) >= 1:
iterator(child)
if True: # Add your entire condition here
parents.remove(child)
iterator(root, nested=True)
Для OP это должноработать - но у меня нет данных, с которыми вы работаете, чтобы проверить, идеально ли это.
import xml.etree.ElementTree as et
file = 'test.xml'
tree = et.parse(file)
namespace = "{http://somens}"
props = tree.findall('.//{0}prop'.format(namespace))
def iterator(parents, nested=False):
for child in reversed(parents):
if nested:
if len(child) >= 1:
iterator(child)
if prop.attrib.get('type') == 'json':
value = json.loads(prop.attrib['value'])
if value['name'] == 'Page1.Button1':
parents.remove(child)
iterator(props, nested=True)