如何创建这样的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>
我会动态创建此项,并且对于我拥有的每个项目,我会使用我需要的值填充PATH
和NAME
变量。
我正在尝试使用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>
我无法弄清楚如何生成我需要的那种。对不起,如果我犯了明显的错误。我感谢任何帮助。谢谢!
答案 0 :(得分:1)
除了一些小的语法和使用问题之外,您处于正确的轨道上:
class
是一个Python关键字,您不能将其用作函数参数名称(基本上是class = 'playlistItem'
正在执行的操作data-type
在Python中不是有效的变量名称,它将被评估为data MINUS type
,请考虑使用dataType
或data_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')