2013-03-25 75 views
-1

我正在使用下面的代碼創建一個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>') 

回答

0

我不知道這是一個好主意,解析和轉儲你的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)) 

。希望幫助。

0

下面是如何將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()函數。