我有一个xml定义为字符串my_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>
答案 0 :(得分:3)
问题出在您的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>