-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. importステートメントをに変更し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 に答える