这是我的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结构,我不太喜欢在每个级别检查标记类型的递归函数的想法。
最佳答案
与ElementTree一起,使用父级查找相关的子级:
>>> parent = root.find('.//bean[@class="bean1"]')
>>> parent
<Element 'bean' at 0x10eb31550>
>>> parent.find('.//value').text
'foo'