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

标签 python xml elementtree

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

示例文件.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/

相关文章:

python - 在 post_save 上添加 M2M

java - 查询原始 XML 架构的 XSD 有效 XML

java - 如何在 Java 中使用 XPATH 读取 xml

python - 尝试理解元素树

python - 让 python 和 meteor 说话的最佳方式

python - 不间断循环迭代次数

python - HttpResponseForbidden 和 handler403

java - Tomcat 8 管理器,HTML 和文本运行,从 ANT 连接访问被拒绝

python - 我可以使用 ElementTree 获取 XML 文件的完整结构吗?

python - 使用 ElementTree 跟踪父元素