Вот мой 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>
(из класса свойств = «типизированный» элемент).
Теперь, чтобы добиться этого, я хотел бы сделать что-то вроде этого:
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, мне не очень нравится идея рекурсивной функции, которая проверяет типы тегов на каждом уровне.