2016-07-20 23 views
0

ich eine XML-Datei geladen haben, von dem ich möchte Elemente entfernen, die keine Attribute oder Kinder haben, ich versuche, so etwas zu erreichen:XML entfernen Knoten ohne Attribute oder Kinder

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

Aber Ich schätze das Problem ist, dass ich das Element finde, das dann versucht, es vom Wurzelelement zu entfernen. Kann mir bitte jemand sagen, wie man das macht?

Antwort

0

Sie müssen einen Knoten von seinem übergeordneten Element entfernen, nicht vom Stammverzeichnis.

Der folgende Code arbeitet für 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) 

Der Standard xml.etree.ElementTree den übergeordneten Knoten des Auswählens jedes ordentliches Verfahren fehlt. Wir können durch die Konstruktion einer Kind-to-Mutterkarte für den gesamten Baum (source) um diese Einschränkung umgehen:

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

Sorry, was ich fehle? AttributeError: 'xml.etree.ElementTree.Element' Objekt hat kein Attribut 'getparent' – mao

+0

'getparent()' ist in lxml verfügbar, aber nicht in der Standardbibliothek ElementTree Modul. – mzjn

+0

@mao Ich sehe. Versuchen Sie 'child.findall ('..') [0] .remove (child)'. – Tomalak