这是我的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'

09-10 06:01
查看更多