使用ElementTree或lxml创建xml文件
问题描述:
我正在使用下面的代码创建一个XML文件,但格式化会搞砸。我想知道如果任何人有如何创建使用ElementTree的或LXML以下代码格式化XML文件输入..使用ElementTree或lxml创建xml文件
data = [['SEC.12.0', '\\\\DATA\\LOC', '\\\\ftp\\location'], ['SEC.13.0', '\\\\DATA\\LOC2', '\\\\ftp\\location2']]
f = open('data.xml', 'w')
f.write('<combo>')
for line in data :
f.write('<pro>' + line[0] + '</pro>')
f.write ('\n')
f.write('<dataloc>' + line[1] + '</dataloc>')
f.write('\n')
f.write('<ftploc>' + line[2]+ '</ftploc>')
f.write('\n')
f.write(</combo>')
答
我不知道这是一个好主意,解析和转储你的XML字符串只是美化。您只需预先格式的XML字符串是这样的:
from lxml import etree
data = [['SEC.12.0', '\\\\DATA\\LOC', '\\\\ftp\\location'], ['SEC.13.0', '\\\\DATA\\LOC2', '\\\\ftp\\location2']]
COMBO = """<combo>
{0}
</combo>"""
ITEM = """
<pro>{0}</pro>
<dataloc>{1}</dataloc>
<ftploc>{2}</ftploc>
"""
output = COMBO.format("".join([ITEM.format(*line) for line in data]))
with open('data.xml', 'w') as f:
f.write(output)
仅供参考,这里是你如何与lxml
做到这一点(我已经改变形成的XML处理了一下):
from lxml import etree
data = [['SEC.12.0', '\\\\DATA\\LOC', '\\\\ftp\\location'], ['SEC.13.0', '\\\\DATA\\LOC2', '\\\\ftp\\location2']]
xml_string = '<combo>'
for line in data:
xml_string += "<pro>{0}</pro>\n<dataloc>{1}</dataloc>\n<ftploc>{2}</ftploc>\n".format(*line)
xml_string += '</combo>'
parser = etree.XMLParser(remove_blank_text=True)
root = etree.fromstring(xml_string, parser)
with open('data.xml', 'w') as f:
f.write(etree.tostring(root, pretty_print=True))
。希望帮助。
答
下面是如何将XML文档可使用LXML的Element
和SubElement
功能(不需要输入任何尖括号中)来创建:
from lxml import etree
data = [['SEC.12.0', '\\\\DATA\\LOC', '\\\\ftp\\location'],
['SEC.13.0', '\\\\DATA\\LOC2', '\\\\ftp\\location2']]
combo = etree.Element("combo") # Root element of XML document
for line in data:
etree.SubElement(combo, 'pro').text = line[0]
etree.SubElement(combo, 'dataloc').text = line[1]
etree.SubElement(combo, 'ftploc').text = line[2]
etree.ElementTree(combo).write("data.xml", pretty_print=True)
该程序输出一个名为data.xml中的文件,其内容如下:
<combo>
<pro>SEC.12.0</pro>
<dataloc>\\DATA\LOC</dataloc>
<ftploc>\\ftp\location</ftploc>
<pro>SEC.13.0</pro>
<dataloc>\\DATA\LOC2</dataloc>
<ftploc>\\ftp\location2</ftploc>
</combo>
上面的代码可以被修改以ElementTree的工作:
- 将导入语句更改为
from xml.etree import ElementTree as etree
。 - 删除
write()
方法中的pretty_print
参数。
但是输出不会很漂亮。要解决该问题,可以使用http://effbot.org/zone/element-lib.htm#prettyprint中的indent()
函数。