2016-12-15 10 views
2

xmlが文字列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> 

答えて

3

問題は、あなたのcopy相である:

  • はあなたがそれぞれelまたは両方el共有し、同じ参照のためにそれを行う必要があります
  • 浅いコピーはここに

私は、Python 3を使用してそれをカットしていませんので、copy()方法が存在しないので、あなたは、copy.deepcopy()を使用する必要があります。私はdeepcopyとの両方アイテムを使用して、copyモジュールを使用していた(またはあなたが一度だけコピーしている)すべての参照が

を重複していることを確認する 私が変更コード(ループとのより良い)の

一部:

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> 
+0

ありがとうございました! –

関連する問題