使用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的ElementSubElement功能(不需要输入任何尖括号中)来创建:

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的工作:

  1. 将导入语句更改为from xml.etree import ElementTree as etree
  2. 删除write()方法中的pretty_print参数。

但是输出不会很漂亮。要解决该问题,可以使用http://effbot.org/zone/element-lib.htm#prettyprint中的indent()函数。