gpt4 book ai didi

python - 使用 ElementTree 跟踪父元素

转载 作者:行者123 更新时间:2023-12-01 05:24:55 24 4
gpt4 key购买 nike

这是我的 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 结构,我不太喜欢在每个级别检查标签类型的递归函数的想法。

最佳答案

这是我解决这个问题的方法:

#gives you a list of every parent,child tuple
def iterparent(tree):
for parent in tree.getiterator():
for child in parent:
yield parent, child

#recursive function. Deletes the given child node, from n parents back.
#If n = 0 it deletes just the child.
def removeParent(root, childToRemove, n):

for parent, child in iterparent(root):
if (childToRemove == child):
if n>0:
removeParent(root, parent, n-1)
else:
parent.remove(child)


for parent, child in iterparent(root):
if (child.tag == 'value' and (child.text in valuesToDelete):
if (parent.tag == 'list'):
removeParent(root, child, 0)
else:
removeParent(root, child, 2)

它实际上非常优雅。我喜欢。

就我的目的而言,这种方法效果很好,但对于各种元素结构和深度可能会遇到困难。

关于python - 使用 ElementTree 跟踪父元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21566292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com