使用ElementTree或lxml创建xml文件

时间:2013-03-25 05:23:24

标签: python xml xml-parsing lxml elementtree

我正在使用以下代码创建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>')

2 个答案:

答案 0 :(得分: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))

希望有所帮助。

答案 1 :(得分:0)

以下是如何使用lxml的ElementSubElement函数创建XML文档(无需键入任何尖括号):

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. 删除pretty_print方法中的write()参数。
  3. 但输出不会很漂亮。要解决该问题,您可以使用http://effbot.org/zone/element-lib.htm#prettyprint中的indent()功能。