我好像被困住了。我正在尝试获得从python代码生成的xml的多次迭代。它只将最新的迭代写入文件。
这是我的代码:
import xml.etree.cElementTree as ET
from random import randint
i=5
while i>-4:
event = ET.Element("event")
event.set("class", "rer")
event.set("id", "EV_%d" % (i))
event.set("date", "${ev_d}")
loc = ET.SubElement(event, "loc")
flir = ET.SubElement(loc, "flir")
de = ET.SubElement(flir, "de")
de.set("dist", "km")
de.set("val", "%d" % (randint(0,2)))
i -=1
tree = ET.ElementTree(event)
tree.write("test.xml")我得到的是:
<event class="rer" date="${ev_d}" id="EV_-3">
<loc>
<flir>
<de dist="km" val="0" />
</flir>
</loc>
</event>在输出文件中我想要的是:
<event class="rer" date="${ev_d}" id="EV_5">
<loc>
<flir>
<de dist="km" val="0" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_4">
<loc>
<flir>
<de dist="km" val="0" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_3">
<loc>
<flir>
<de dist="km" val="0" />
</flir>
</loc>
</event>提前谢谢你的帮助。
你好,merit_2
发布于 2016-03-15 17:16:33
正如@jwodder所指出的,建议的输出不是有效的XML。你的选择是解决这个问题或者绕开它。因为您提到了这只是一个组件,所以如果您有一个父元素,每个<event>都要嵌套在这个元素下面,那么这里有一种方法可以这样做。
import xml.etree.cElementTree as ET
from random import randint
parent = ET.Element("parent")
tree = ET.ElementTree(parent)
i=5
while i>-4:
event = ET.Element("event")
event.set("class", "rer")
event.set("id", "EV_%d" % (i))
event.set("date", "${ev_d}")
loc = ET.SubElement(event, "loc")
flir = ET.SubElement(loc, "flir")
de = ET.SubElement(flir, "de")
de.set("dist", "km")
de.set("val", "%d" % (randint(0,2)))
i -=1
parent.append(event)
tree.write("test.xml")在这里,我将父元素和append-ed事件添加到父元素中,然后将父树写入到文件的末尾。
输出:
<parent>
<event class="rer" date="${ev_d}" id="EV_5">
<loc>
<flir>
<de dist="km" val="1" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_4">
<loc>
<flir>
<de dist="km" val="2" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_3">
<loc>
<flir>
<de dist="km" val="2" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_2">
<loc>
<flir>
<de dist="km" val="1" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_1">
<loc>
<flir>
<de dist="km" val="2" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_0">
<loc>
<flir>
<de dist="km" val="0" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_-1">
<loc>
<flir>
<de dist="km" val="2" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_-2">
<loc>
<flir>
<de dist="km" val="0" />
</flir>
</loc>
</event>
<event class="rer" date="${ev_d}" id="EV_-3">
<loc>
<flir>
<de dist="km" val="2" />
</flir>
</loc>
</event>
</parent>发布于 2016-03-15 16:57:19
您不断地在while循环中覆盖事件--所以很自然地,您只需要在事件上打印。你需要做的事情是:
import xml.etree.cElementTree as ET
from random import randint
i = 5
events = []
while i > -4:
event = ET.Element("event")
event.set("class", "rer")
event.set("id", "EV_%d" % (i))
event.set("date", "${ev_d}")
loc = ET.SubElement(event, "loc")
flir = ET.SubElement(loc, "flir")
de = ET.SubElement(flir, "de")
de.set("dist", "km")
de.set("val", "%d" % (randint(0, 2)))
events.append(event)
i -= 1
with open('output.xml', 'w') as out:
for event in events:
tree = ET.ElementTree(event)
tree.write(out)
out.write('\n')https://stackoverflow.com/questions/36016581
复制相似问题