我正在尝试创建一个xml文件的应用程序,我想为某些元素分配文本。此文本包含文件夹上的图像文件。代码如下:
import glob
import os
import os.path
from xml.etree import ElementTree
from xml.dom import minidom
import xml.etree.ElementTree as ET
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ElementTree.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
path = "/home/unkuiri/Ubuntu One/Wallpapers/*"
background = ET.Element('background')
starttime = ET.SubElement(background, 'starttime')
year = ET.SubElement(starttime, 'year')
month = ET.SubElement(starttime, 'month')
day = ET.SubElement(starttime, 'day')
hour = ET.SubElement(starttime, 'hour')
minute = ET.SubElement(starttime, 'minute')
second = ET.SubElement(starttime, 'second')
static = ET.SubElement(background, 'static')
duration_stat = ET.SubElement(static, 'duration')
files = ET.SubElement(static, 'file')
transition = ET.SubElement(background, 'transition')
duration_trans = ET.SubElement(transition, 'duration')
from1 = ET.SubElement(transition, 'from')
to = ET.SubElement(transition, 'to')
dirList = glob.glob(path)
while len(background.findall("./static/file")) <= len([name for name in os.listdir('.') if os.path.isfile(name)]):
background.append(static)
background.append(transition)
continue
for fname in dirList:
to.text = fname
files.text = fname
from1.text = fname
print prettify(background)
此代码输出格式正确的xml,但只输出最后一个路径,重复次数与文件夹中的文件数一样多。我想要的是它为每个“file”元素打印一个路径,在前面的“to”元素上打印相同的路径,从“element”打印下一个路径。也许这是一个我不知道的简单解决方案。我还是个新手。
提前致谢
答案 0 :(得分:3)
您只需创建一个元素并多次添加此相同元素。
在你的for循环中,你一遍又一遍地分配该元素的成员,所以最后它最终只有那里的最后一个fname
您需要创建一个新元素并在每次for循环中填充它
可能你应该有更像这样的东西
background = ET.Element('background')
dirList = glob.glob(path)
for fname in dirList:
starttime = ET.SubElement(background, 'starttime')
year = ET.SubElement(starttime, 'year')
month = ET.SubElement(starttime, 'month')
day = ET.SubElement(starttime, 'day')
hour = ET.SubElement(starttime, 'hour')
minute = ET.SubElement(starttime, 'minute')
second = ET.SubElement(starttime, 'second')
static = ET.SubElement(background, 'static')
duration_stat = ET.SubElement(static, 'duration')
files = ET.SubElement(static, 'file')
transition = ET.SubElement(background, 'transition')
duration_trans = ET.SubElement(transition, 'duration')
from1 = ET.SubElement(transition, 'from')
to = ET.SubElement(transition, 'to')
to.text = fname
files.text = fname
from1.text = fname
答案 1 :(得分:0)
您在每次迭代时都会踩到/ files / from1而不将它们保存在任何地方。在您有机会对数据执行任何操作之前,每次迭代都会覆盖上一次迭代中的内容。
你的意思是存储这些变量吗?你的意思是在每次迭代时都做print prettify(background)
吗?
答案 2 :(得分:0)
我设法用这段代码解决了这个问题:
import glob
from xml.etree import ElementTree
from xml.dom import minidom
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ElementTree.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
import xml.etree.ElementTree as ET
path = "/home/unkuiri/Ubuntu One/Wallpapers/*"
background = ET.Element('background')
dirList = glob.glob(path)
starttime = ET.SubElement(background, 'starttime')
year = ET.SubElement(starttime, 'year')
year.text = '2012'
month = ET.SubElement(starttime, 'month')
month.text = '10'
day = ET.SubElement(starttime, 'day')
day.text = '10'
hour = ET.SubElement(starttime, 'hour')
hour.text = '00'
minute = ET.SubElement(starttime, 'minute')
minute.text = '00'
second = ET.SubElement(starttime, 'second')
second.text = '00'
for i,fname in enumerate(dirList):
static = ET.SubElement(background, 'static')
duration_stat = ET.SubElement(static, 'duration')
duration_stat.text = '1795.0'
files = ET.SubElement(static, 'file')
transition = ET.SubElement(background, 'transition')
duration_trans = ET.SubElement(transition, 'duration')
duration_trans.text = '5.0'
from1 = ET.SubElement(transition, 'from')
to = ET.SubElement(transition, 'to')
from1.text = dirList[i-1]
files.text = dirList[i-1]
to.text = dirList[i]
print prettify(background)