gpt4 book ai didi

python - Elementtree如何使用append移动xml节点?

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

我正在尝试将一组节点移动为不同元素的子元素。

示例文件.xml

<root>
<OuterNode>
<Node>
<Name>NodeA</Name>
</Node>
<Node>
<Name>NodeB</Name>
</Node>
<SpecialNode>
<Name>NodeZ</Name>
</SpecialNode>
</OuterNode>
</root>

使用这段代码,我只能让第一个“节点”移动

import xml.etree.ElementTree as etree


tree = etree.parse('sampleFile.xml')
root = tree.getroot()

next_node = etree.Element('NextOuterNode')
root.append(next_node)

for parent in root:
if parent.tag == 'OuterNode':
for child in parent:
if child.tag == 'Node':
parent.remove(child)
next_node.append(child)

摸索了一会儿,我发现这会移动两个节点

outer_node = tree.find('./OuterNode')
for e in tree.findall('./OuterNode/Node'):
next_node.append(e)
outer_node.remove(e)

所以我的问题是可迭代列表的区别是什么

for child in parent

for e in tree.findall

生成?

最佳答案

我不能肯定地说(而且我猜想明确回答的唯一方法是挖掘源代码),但我猜想区别在于第一个是位置并遍历父级和第二个创建一个新列表并遍历它。

考虑一下,当你运行这个:

for child in parent

如果你有两个元素,并且它正在遍历父元素,如果你删除第一个元素,第二个元素将成为第一个元素,因为循环已经完成了第一个元素,所以它不会重复并且循环完成。

第二个:

for e in tree.findall

通过父级的迭代不是这样实现的(因为元素可以在任何地方),所以创建了一个新的引用列表。移动这些不会更改引用,因此它会正确循环。

当然这都是猜想,但它符合你的描述。

关于python - Elementtree如何使用append移动xml节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33743426/

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