2017-10-09 149 views
0

如何創建這樣的XML文件?Python創建XML文件

<?xml version="1.0" encoding="utf-8"?> 

<data> 

    <li class= 'playlistItem' data-type='local' data-mp3='PATH' > 
     <a class='playlistNonSelected' href='#'>NAME</a> 
    </li> 

    ... 

</data> 

我會動態創建這個和我有每個項目,我會在PATHNAME變量與我需要填入值。我正在嘗試使用lxml。這是我想出這麼遠,但我不認爲這是正確的:

from lxml import etree 

for item in my_list: 
    root = etree.Element('li', class = 'playlistItem', data-type = 'local', data-mp3 = PATH) 
    child = etree.Element('a', class = 'playlistNonSelected', href ='#') 
    child.text = NAME 

即使以上是正確的,我迷路了,在這一點上,因爲如果我有20個項目該列表,我怎麼能爲他們每個人做這個,然後把它全部寫到一個XML文件中?我試着尋找其他的答案,但大部分的答覆是生成這樣的XML:

<root> 
    <child/> 
    <child>some text</child> 
</root> 

我無法弄清楚如何生成我需要的那種。對不起,如果我犯了明顯的錯誤。我感謝任何幫助。謝謝!

回答

1

你是在正確的軌道上保存了一些小的語法和用法的問題:

  1. class是一個Python關鍵字,你不能用它作爲函數參數名稱(這基本上是什麼class = 'playlistItem'是做
  2. data-type沒有在Python一個有效的變量名,否則將被評估爲data MINUS type,可以考慮使用類似dataTypedata_type,有可能是解決這個辦法,但恕我直言,那會使代碼過於複雜,不添加任何價值(請參閱編輯#1對如何做到這一點

話雖這麼說,下面的代碼片段應該給你有用的東西,你可以從那裏移動。請隨時讓我知道如果你需要任何額外的幫助:

from lxml import etree 

data_el = etree.Element('data') 

# You can do this in a loop and keep adding new elements 
# Note: A deepcopy will be required for subsequent items 
li_el = etree.SubElement(data_el, "li", class_name = 'playlistItem', data_type = "local", data_mp3 = "PATH") 
a_el = etree.SubElement(li_el, "a", class_name = 'playlistNotSelected', href='#') 

print etree.tostring(data_el, encoding='utf-8', xml_declaration = True, pretty_print = True) 

,這將產生以下輸出(可以寫入文件):

<?xml version='1.0' encoding='utf-8'?> 
<data> 
    <li class_name="playlistItem" data_mp3="PATH" data_type="local"> 
    <a class_name="playlistNotSelected" href="#"/> 
    </li> 
</data> 

編輯# 0:

或者,您也可以通過首先將它轉換爲ElementTree來寫入文件,例如

# Replace sys.stdout with a file object pointing to your object file: 
etree.ElementTree(data_el).write(sys.stdout, encoding='utf-8', xml_declaration = True, pretty_print = True) 

編輯#1:

由於元素屬性的字典,你可以使用set不受任何限制指定任意屬性,例如

li_el.set('class', 'playlistItem') 
li_el.set('data-type', 'local') 
+0

謝謝,這很有幫助!但不幸的是,我正在使用的項目需要XML格式爲'class','data-type'和'data-mp3'。我試過你的方法,它不會識別XML。我認爲現在不可能改變項目的這一部分。有什麼方法可以用這種格式創建XML嗎? – pez

+0

請參閱上次編輯...應該解決您的問題,代價是讓代碼更加冗長。 – schaazzz