Ето моят XML:
<beans>
<property name = "type1">
<list>
<bean class = "bean1">
<property name = "typeb">
<value>foo</value>
</property>
</bean>
<bean class = "bean2">
<property name ="typeb">
<value>bar</value>
</property>
</bean>
</list>
</property>
<property name = "type2">
<list>
<bean class = "bean3">
<list>
<property name= "typec">
<sometags/>
</property>
<property name= "typed">
<list>
<value>foo</value>
<value>bar</bar>
</list>
</property>
</list>
</bean>
</list>
</property>
</beans>
Сега това, което искаме да направим, е да сканираме това и да изтрием тези елементи:
<bean class = "bean1">
<property = "typeb">
<value>foo</value>
</property>
</bean>
И:
<value>foo</value>
(от свойство class = "typed" елемент).
Сега, за да постигна това, това, което бих искал да направя, е нещо подобно:
for element in root.iter('value'):
if element.text == 'foo':
p1= element.getParent()
if p1.tag == 'list': #second case scenario, remove just the value tag.
p1.remove(element)
else: #first case scenario - remove entire bean
p2 = p1.getParent()
p3 = p2.getParent()
p3.remove(p2)
Въпреки това ElementTree
не поддържа дете да вижда своя родителски елемент.
Какъв би бил ефективният начин за постигане на това? Като се има предвид, че това е дълбока XML структура, не ми харесва много идеята за рекурсивна функция, която проверява типовете тагове на всяко ниво.