<p>您不需要替换任何内容,只需使用新值来覆盖:</p>
<pre><code>from xml.etree import ElementTree as ET
xml_file = "./test.xml"
tree = ET.parse(xml_file)
root1 = tree.getroot()
data_list = {'ADSType':['HS11N', 'HS11V'], 'Type': ['Bond', 'Cash']}
# make iterator so we just call next(sids) to pull each value
sids = iter(data_list['ADSType'])
for flds in root1.iter('flds'):
for f in flds.iter('f'):
# set to new value
f.set("sid", next(sids))
# write
tree.write("./test.xml")
</code></pre>
<p>这正是你想要的,尽管我不知道完整的格言如何符合你的问题:</p>
<p>test.xml文件:</p>
<pre><code>In [3]: !cat test.xml
<req Times="1" action="get" chunklimit="1000" lang="ENU" msg="1" rank="1" rnklst="1" runuf="0">
<flds>
<f end="2016-02-29" freq="m" i="bond(long) hff" sid="abc" start="2016-02-29" />
<f end="2016-02-29" freq="m" i="bond(short) ggg" sid="abc" start="2016-02-29" />
</flds>
<dat>
<r CalculationType="3" ForceCalculate="1" i="123" />
</dat>
</req>
</code></pre>
<p>运行代码:</p>
<pre><code>In [4]: from xml.etree import ElementTree as ET
In [5]: xml_file = "./test.xml"
In [6]: tree = ET.parse(xml_file)
In [7]: root1 = tree.getroot()
In [8]: data_list = {'ADSType': iter(['HS11N', 'HS11V']), 'Type': iter(['Bond', 'Cash'])}
In [9]: sids = iter(data_list['ADSType'])
In [10]: for flds in root1.iter('flds'):
....: for f in x.iter('f'):
....: f.set("sid", next(sids))
....: tree.write("./test.xml")
....:
</code></pre>
<p>新建test.xml:</p>
<pre><code>In [11]: !cat test.xml
<req Times="1" action="get" chunklimit="1000" lang="ENU" msg="1" rank="1" rnklst="1" runuf="0">
<flds>
<f end="2016-02-29" freq="m" i="bond(long) hff" sid="HS11N" start="2016-02-29" />
<f end="2016-02-29" freq="m" i="bond(short) ggg" sid="HS11V" start="2016-02-29" />
</flds>
<dat>
<r CalculationType="3" ForceCalculate="1" i="123" />
</dat>
</req>
</code></pre>
<p>如果在多个fld中有多个f,并且希望循环这些值,请使用<em>itertools.cycle</em>代替iter:</p>
<pre><code>from itertools import cycle
sids = cycle(data_list['ADSType'])
</code></pre>