ElementTree: Springende Iteration von Element.remove ()
Ich habe diese XML-Eingabedatei:
<?xml version="1.0"?>
<zero>
<First>
<second>
<third-num>1</third-num>
<third-def>object001</third-def>
<third-len>458</third-len>
</second>
<second>
<third-num>2</third-num>
<third-def>object002</third-def>
<third-len>426</third-len>
</second>
<second>
<third-num>3</third-num>
<third-def>object003</third-def>
<third-len>998</third-len>
</second>
</First>
</zero>
Mein Ziel ist es, jede zweite Ebene zu entfernen, für die<third-def>
das ist kein wert. Dazu habe ich diesen Code geschrieben:
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
inputfile='inputfile.xml'
tree = ET.parse(inputfile)
root = tree.getroot()
elem = tree.find('First')
for elem2 in tree.iter(tag='second'):
if elem2.find('third-def').text == 'object001':
pass
else:
elem.remove(elem2)
#elem2.clear()
Mein Problem istelem.remove(elem2)
. Es wird jede zweite Ebene übersprungen. Hier ist die Ausgabe dieses Codes:
<?xml version="1.0" ?>
<zero>
<First>
<second>
<third-num>1</third-num>
<third-def>object001</third-def>
<third-len>458</third-len>
</second>
<second>
<third-num>3</third-num>
<third-def>object003</third-def>
<third-len>998</third-len>
</second>
</First>
</zero>
Nun, wenn ich den Kommentar entkommentiereelem2.clear()
Zeile, das Skript funktioniert perfekt, aber die Ausgabe ist weniger schön, da es alle entfernt hältzweite Ebenen:
<?xml version="1.0" ?>
<zero>
<First>
<second>
<third-num>1</third-num>
<third-def>object001</third-def>
<third-len>458</third-len>
</second>
<second/>
<second/>
</First>
</zero>
Hat jemand eine Ahnung warum meineelement.remove()
Aussage ist falsch?