在python中更改特定的附加xml元素会更改所有附加元素

时间:2016-10-25 14:24:58

标签: python xml

为什么在我追加xml对象后我想改变它的子节点所有的值都被改变了?

我想复制xml元素并更改它的'dd'值。示例输入表:

<aaa>
    <bb>
        <cc>dd</cc>
    </bb>
</aaa>

我希望以下代码可以解决问题:

import xml.etree.ElementTree as ET
import copy

xml     = ET.parse('xml.xml')
root    = xml.getroot()

entity = copy.deepcopy(root[0])
for i in range(1, 5):
    print(i)
    root.append(entity)
    root[i][0].text = 'eee'+str(i)
xml.write('output_xml.xml')

我希望看到eee1到eee4的价值观,但出乎意料的是我收到了:

<aaa>
    <bb>
        <cc>dd</cc>
    </bb>
<bb>
        <cc>eee4</cc>
    </bb>
<bb>
        <cc>eee4</cc>
    </bb>
<bb>
        <cc>eee4</cc>
    </bb>
<bb>
        <cc>eee4</cc>
    </bb>
</aaa>

运行以下代码:

import xml.etree.ElementTree as ET
import copy

xml     = ET.parse('output_xml.xml')
root    = xml.getroot()

entity = copy.deepcopy(root[0])
for i in range(1, 5):
    print(i)
    root[i][0].text = 'eee'+str(i)
xml.write('output_xml.xml')

更正输出:

<aaa>
    <bb>
        <cc>dd</cc>
    </bb>
<bb>
        <cc>eee1</cc>
    </bb>
<bb>
        <cc>eee2</cc>
    </bb>
<bb>
        <cc>eee3</cc>
    </bb>
<bb>
        <cc>eee4</cc>
    </bb>
</aaa>

1 个答案:

答案 0 :(得分:1)

确定。所以我的老朋友已经解决了这个问题。探测是在python中一切都是参考,在这种情况下,我们最终会引用彼此引用的所有实体副本。要解决此问题,我们需要更改:

root.append(entity)

为:

root.append(copy.deepcopy(entity))