2017-10-09 6 views
0

このようなXMLファイルを作成するにはどうすればよいですか?Pythonは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を生成するために、次のとおりです。

<root> 
    <child/> 
    <child>some text</child> 
</root> 

そして私は、私は必要なものを生成する方法を見つけ出すことはできません。私が明白な間違いをした場合は申し訳ありません。私はどんな助けにも感謝します。ありがとうございました!

答えて

1

あなたはいくつかのマイナーな構文と使用に関する問題のために保存正しい軌道に乗っている:

  1. classはPythonのキーワードである、あなたはclass = 'playlistItem'が何であるか、本質的である(関数の引数名として使用することはできませんPythonで有効な変数名ではありません、dataTypeまたはdata_typeのようなものを使用することを検討して、data MINUS typeとして評価されます。これを回避する方法があるかもしれません
  2. 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') 
+0

ありがとう、これは役に立ちます!しかし残念ながら、私が取り組んでいるプロジェクトでは、XMLが 'class'、' data-type'、 'data-mp3'の形式である必要があります。私はあなたの方法を試したが、それはXMLを認識しませんでした。私はこの時点でプロジェクトのその部分を変更することは可能ではないと思います。この形式でXMLを作成する方法はありますか? – pez

+0

最後の編集を参照してください...あなたの問題を解決するはずですが、コードを少し冗長にすることを犠牲にしてください。 – schaazzz

関連する問題