2016-07-20 9 views
0

У меня есть файл XML загружен, из которого я хочу, чтобы удалить элементы, которые не имеют атрибутов или детей, я пытаюсь добиться чего-то вроде этого:XML удалить узлы без атрибутов или детей

for child in root.find('targetElement'): 
    print(child) 
    if(len(child.attrib) < 1 and len(child) < 1): 
     root.remove(child) 

Но Я думаю, проблема в том, что я нахожу элемент, а затем пытаюсь удалить его из корневого элемента. Может кто-нибудь, пожалуйста, скажите мне, как это сделать?

ответ

0

Вам нужно удалить узел из его родителя, а не из корня.

Следующий код работает для lxml.etree:

from lxml import etree as ET 

root = ET.parse('yourfile.xml') 

for child in root.iterfind('targetElement'): 
    if(len(child.attrib) < 1 and len(child) < 1): 
     child.getparent().remove(child) 

Стандарт xml.etree.ElementTree отсутствует какой-либо достойный способ выбора родительского узла. Мы можем обойти это ограничение, построив карту ребенка к родителю для всего дерева (source):

import xml.etree.ElementTree as ET 

root = ET.parse('yourfile.xml') 

# https://stackoverflow.com/a/20132342/18771 
parent_map = {c:p for p in root.iter() for c in p} 

for child in root.iterfind('targetElement'): 
    if(len(child.attrib) < 1 and len(child) < 1): 
     parent_map[child].remove(child) 
+0

Извините, что я не хватает? AttributeError: объект 'xml.etree.ElementTree.Element' не имеет атрибута 'getparent' – mao

+0

'getparent()' доступен в lxml, но не в стандартном модуле ElementTree библиотеки. – mzjn

+0

@mao Я вижу. Попробуйте 'child.findall ('..') [0] .remove (child)'. – Tomalak