xml元素的文本未重新分配给新值

时间:2016-12-15 19:22:34

标签: python xml python-2.7

我有一个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>

1 个答案:

答案 0 :(得分:3)

问题出在您的copy阶段:

  • 您应该为每个elel共享相同的参考
  • 执行此操作
  • 您应该使用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>