2017-04-16 15 views
0

要素の要素と要素を繰り返し処理し、その属性をチェックします。特定の属性値が欠落している場合は、その属性値を持つ空の要素を追加する必要があります。xmlの属性をチェックし、Python 3.4で要素を追加します。

だからこれに:

for app in root.findall('app'): 
    if '#W_1956' not in ET.Element('rdg').attrib: 
     new_tag = ET.SubElement(app, 'rdg') 

     new_tag.attrib['wit'] = '#W_1956' 
    if '#W_1999' not in ET.Element('rdg').attrib: 
     new_tag = ET.SubElement(app, 'rdg') 

     new_tag.attrib['wit'] = '#W_1999' 

私にこのXMLを与える:

<app>   
    <rdg wit="#W_1956">Im Restaurant </rdg>    
    <rdg wit="#W_2002">Im Restaurant </rdg> 
    <rdg wit="#W_2010">Im Restaurant </rdg> 
</app> 

私は

<rdg wit="#W_1999"/> 

私のPythonのコードは次のようになります要素を追加したいです

<app>   
    <rdg wit="#W_1956">Im Restaurant </rdg> 
    <rdg wit="#W_2002">Im Restaurant </rdg> 
    <rdg wit="#W_2010">Im Restaurant </rdg> 
    <rdg wit="#W_1956"/> 
    <rdg wit="#W_1999"/> 
</app> 

したがって、ソースにW_1956属性のある要素があっても、それはとにかく追加されます。私も代わりにfindall( 'rdg')を試しましたが、どちらも動作しません(出力XMLは完全に変更されません)。今、if-statement、elementree-(sub)要素のどこかに誤りがあるのか​​、コードが完全に間違っているのかは分かりません。

答えて

0

明示的な属性を使用してください。たとえば:

. 
. 
. 
if '#W_1956' not in ET.Element('rdg').attrib['wit'] 
. 
. 
. 
0

は条件付きで別々のリストに保存することにより、rgd属性のドキュメントの全リストから確認することを検討してください。次に、etreeの解析が、XML属性をキー/値のペアを持つPython辞書としてレンダリングするという事実を利用して、新しい要素を追加するか否かを繰り返しチェックします。

import xml.etree.ElementTree as ET 

txt ='''<app>   
    <rdg wit="#W_1956">Im Restaurant </rdg>    
    <rdg wit="#W_2002">Im Restaurant </rdg> 
    <rdg wit="#W_2010">Im Restaurant </rdg> 
</app>''' 

root = ET.fromstring(txt) 

# LIST OF ALL ATTRIBUTE DICTS 
attrdict = [app.attrib for app in root.findall('./rdg')] 
# LIST OF ALL ATTRIBUTE VALUES 
attrvals = [v for i in attrdict for k,v in i.items()] 

# ITERATE THROUGH ATTRIB VALUES AND ADD TO ROOT IF DOES NOT EXIST 
for i in ['#W_1956', '#W_1999']: 
    if i not in attrvals: 
     new_tag = ET.SubElement(root, 'rdg') 
     new_tag.attrib['wit'] = i 

# OUTPUT TO STRING 
print(ET.tostring(root).decode('UTF-8')) 
# <app>   
# <rdg wit="#W_1956">Im Restaurant </rdg>    
# <rdg wit="#W_2002">Im Restaurant </rdg> 
# <rdg wit="#W_2010">Im Restaurant </rdg> 
# <rdg wit="#W_1999" /></app> 

# OUTPUT TO FILE 
ET.ElementTree(root).write('myoutput.xml', encoding="UTF-8", xml_declaration=True) 
+0

ありがとうございましたが、これはアプリタグ の子供 ... ' – Ilkar

+0

近くをご覧ください。 etreeの出力は、インデントが正しく終わりでは正しく印刷されませんが、タグは* app *の子に追加されます。 – Parfait

関連する問題