我有一个定义为字符串my_xml的xml。
然后,我尝试增加字符串数量并更改一些值。

my_xml = """<root><foo><bar>spamm.xml</bar></foo></root>"""
from xml.etree import ElementTree as et
tree = et.fromstring(my_xml )
el = list(tree)[0].copy()
tree.insert(0, el)
tree.insert(0, el)
cnt = 0
elements = [elem for elem in tree.iter() if elem.text is not None]
for elem in elements:
    if cnt !=0:
        print elem.text[:4]+str(cnt)+elem.text[5:]
        elem.text= elem.text[:4]+str(cnt)+elem.text[5:] # strange behavour
    cnt +=1

print et.tostring(tree)


为什么elem.text= elem.text[:4]+str(cnt)+elem.text[5:]字符串没有将elem.text重新分配给新值?

预期产量

<root>
<foo><bar>spamm.xml</bar></foo>
<foo><bar>spamm1.xml</bar></foo>
<foo><bar>spamm2.xml</bar></foo>
</root>


实际产量

<root>
<foo><bar>spam2.xml</bar></foo>
<foo><bar>spam2.xml</bar></foo>
<foo><bar>spam2.xml</bar></foo>
</root>

最佳答案

问题出在您的copy阶段:


您应该为每个el或两个el共享相同的引用
您应该使用copy.deepcopy(),因为浅拷贝不会在此处剪切


我使用python 3,所以copy()方法不存在。我必须使用copy模块,使用deepcopy并在两个项目上都使用(或仅复制一次),以确保所有引用都重复

我更改的代码的一部分(最好使用循环):

import copy
tree = et.fromstring(my_xml)
for _ in range(2):
    el = copy.deepcopy(list(tree)[0])
    tree.insert(0, el)


结果:

<root><foo><bar>spam1.xml</bar></foo><foo><bar>spam1.xml</bar></foo><foo><bar>spam2.xml</bar></foo></root>

10-07 19:11
查看更多