我有一个定义为字符串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>