Python创建XML文件

时间:2017-10-09 02:38:08

标签: python xml

如何创建这样的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 个答案:

答案 0 :(得分:1)

除了一些小的语法和使用问题之外,您处于正确的轨道上:

  1. class是一个Python关键字,您不能将其用作函数参数名称(基本上是class = 'playlistItem'正在执行的操作
  2. data-type在Python中不是有效的变量名称,它将被评估为data MINUS type,请考虑使用dataTypedata_type之类的内容。可能有办法解决这个问题,但是,恕我直言,如果没有添加任何价值,代码会不必要地复杂化( 请参阅编辑#1如何执行此操作
  3. 话虽如此,下面的代码片段应该为您提供一些可用的东西,您可以从那里继续前进。如果您需要任何其他帮助,请随时告诉我们:

    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')