2017-11-01 9 views
1

次のコードを使用して、必要な場所にsubElementを追加できます。機能的に機能します。読みやすさのために、私はitem.appendが新しいサブ要素を挿入する方法を書式化したいと思います。 マイコード:ElementTreeを使用して新しいSubElementを追加および書式設定する

import xml.etree.ElementTree as ET 

tree = ET.parse(file.xml) 
root = tree.getroot() 

for items in root.iter('items'): 
    item = ET.SubElement(items, 'item') 
    item.append((ET.fromstring('<item>cat</item>')))  

tree.write('output.xml') 

XMLファイル:

<interface> 
    <object> 
     <items> 
      <item>dog</Item> 
     </items> 
    </object> 
</interface> 

予想される出力:

<interface> 
    <object> 
     <items> 
      <item>dog</item> 
      <item>cat</item> 
     </items> 
    </object> 
</interface> 

実際の出力:

<interface> 
    <object> 
     <items> 
      <item>dog</item> 
      <item><item>cat</item></item></items> 
    </object> 
</interface> 

通常、私はどのようにそれを気にしないだろうoutput.xmlファイルをフォーマットします。しかし、私はwhileループに<item> subElementsを追加しています。したがって、4つまたは5つの追加があると、コードは読みやすくするためにちょっと邪魔になります。

私はこれに関する多くの類似の質問を見てきましたが、回答がないか、具体的には私がしようとしていることには適用されません。私は事前に任意の助けに感謝

import xml.etree.ElementTree as ET 

tree = ET.parse(file.xml) 
root = tree.getroot() 

while True: 

    item_add = input("Enter item to add: 'n") 
    item_string = '<item>' 
    item_string += item_add 
    item_string += '</item>' 

    for items in root.iter('items'): 
     item = ET.SubElement(items, 'item') 
     item.append((ET.fromstring(item_string))) 

tree.write('output.xml') 

#Code asking for more input, if none break out of loop 

は、ここでそれがより明確化を追加するだけで包み、whileループでは私のコードです。

答えて

2

.find()を使用して必要なノードに移動し、単にSubElementを使用して追加することを検討してください。 etreeのようなDOMライブラリでの作業のマークアップの文字列バージョンを必要としないん:

import xml.etree.ElementTree as ET 

tree = ET.parse("input.xml") 
root = tree.getroot() 

while True: 
    item_add = input("Enter item to add: ") 

    if item_add == 'x': 
     break 

    items = root.find('object').find('items') 
    tmp = ET.SubElement(items, 'item') 
    tmp.text = item_add 

# PRINT TO SCREEN 
print(ET.tostring(root).decode('utf-8')) 

# SAVE TO FILE 
tree.write('output.xml') 

出力(猫を入力した後、カエル、入力でシマウマ、ループを終了するにはXを使用)

<interface> 
    <object> 
     <items> 
      <item>dog</item> 
     <item>cat</item><item>frog</item><item>zebra</item></items> 
    </object> 
</interface> 

内蔵mini.domまたはlxmlpretty printingを使用してください。

+0

これは私が必要としていたものです。ありがとうございます! – Brosta

+0

@Brosta ...あなたは大歓迎です。ハッピーコーディング! – Parfait

関連する問題