[英]Python create XML file
如何创建这样的 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>
而且我不知道如何生成我需要的那种。 对不起,如果我犯了明显的错误。 我很感激任何帮助。 谢谢!
除了一些小的语法和使用问题外,您走在正确的轨道上:
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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.