-1

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

2 回答 2

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

希望有帮助。

于 2013-05-01T14:00:07.153 回答
0

以下是使用 lxmlElementSubElement函数创建 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()

但是输出不会打印得很漂亮。要解决该问题,您可以使用http://effbot.org/zone/element-lib.htm#prettyprintindent()中的函数。

于 2013-05-04T19:14:19.177 回答