gpt4 book ai didi

python - 循环中的 lxml.etree._Element.append() 未按预期工作

转载 作者:行者123 更新时间:2023-11-28 18:36:57 24 4
gpt4 key购买 nike

我想知道为什么在这段代码中 append() 似乎在循环内部工作,但生成的 xml 仅显示最后一次迭代的修改,而 remove() 按预期工作。这是一个过于简化的示例,我正在处理大块数据,并且需要将相同的子树附加到许多不同的父级。

from lxml import etree

xml = etree.fromstring('<tree><fruit id="1"></fruit><fruit id="2"></fruit></tree>')
sub = etree.fromstring('<apple/>')

for i, item in enumerate(xml):
item.append(sub)
print('Fruit {} with sub appended: {}'.format(
i, etree.tostring(item).decode('ascii')))

print('\nResulting tree after iterating through items with append():\n' +
etree.tostring(xml, pretty_print=True).decode('ascii'))

for item in xml:
xml.remove(item)

print('Resulting tree after iterating through items with remove():\n' +
etree.tostring(xml, pretty_print=True).decode('ascii'))

当前输出:

Fruit 0 with sub appended: <fruit id="1"><apple/></fruit>
Fruit 1 with sub appended: <fruit id="2"><apple/></fruit>

Resulting tree after iterating through items with append():
<tree>
<fruit id="1"/>
<fruit id="2">
<apple/>
</fruit>
</tree>

Resulting tree after iterating through items with remove():
<tree/>

在使用 append() 遍历项目后的预期输出:

<tree>
<fruit id="1"/>
<apple/>
</fruit>
<fruit id="2">
<apple/>
</fruit>
</tree>

最佳答案

那是因为您只创建了 <apple/>一个实例被附加。所以基本上你只是将一个实例从一个父级移动到另一个父级直到最后一个 append(sub)执行。尝试移动 <apple/> 的创建for 中的元素循环代替:

for i, item in enumerate(xml):
sub = etree.fromstring('<apple/>')
item.append(sub)
print('Fruit {} with sub appended: {}'.format(
i, etree.tostring(item).decode('ascii')))
print()

输出:

Resulting tree after iterating through items with append():
<tree>
<fruit id="1">
<apple/>
</fruit>
<fruit id="2">
<apple/>
</fruit>
</tree>

关于python - 循环中的 lxml.etree._Element.append() 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31527392/

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