2017-08-22 22 views
0

e-listタグを見つけて、それらを新しいxmlファイルに書きたいと思います。 XMLは、以下の通りである。ここ特定のタグを見つけて新しいxmlファイルに書き込む

<lsm> 
    <m-id>v1</m-id> 
    <name>v1</name> 
    <communication>bi</communication> 
    <states> 
     <s-name>stage1</s-name> 
     <state> 
      <s-type>defaultState</s-type> 
      <s-func> 
       <p-name>pkgname</p-name> 
       <f-list> 
        <f-name>funcNAME</f-name> 
        <f-arg>{&amp;}</f-arg> 
       </f-list> 
      </s-func> 
     </state> 
     <lib-path>libpath</lib-path> 
     <e-list> 
      <e-name>noEvent</e-name> 
      <event> 
       <nss>INC</nss> 
       <nfs>INC</nfs> 
       <actions> 
        <p-name>pkgName</p-name> 
        <f-list> 
         <f-name>toF</f-name> 
         <f-arg></f-arg> 
        </f-list> 
       </actions> 
      </event> 
     </e-list> 

が私のコードで、

import xml.etree.ElementTree as ET 

utree = ET.parse(r'C:\v1.xml') 
uroot = utree.getroot() 

for elist in uroot.iter('e-list'): 
    print elist.tag    # print 3 Tags 
    for ename in elist.iter('e-name'): 
     if (ename.text == 'noEvent' or 'Event'): 
      print "test"  # Print "test" 3 times as i have 3 tags 
      uroot.append(elist) #Commenting this line gives proper output. 
utree.write('v2.xml', xml_declaration=True, encoding='UTF-8') 

これは無限大に行くと、新しいファイルを作成していません。

+0

あなたの目はENAMEとelist.iter – Vinny

+0

@Vinny間in' 'ミス:おかげでヘッドのアップ。それは私のコードでうまくいきました。私はコピー中に台無しに。コードを更新しました。 – tgcloud

+0

別の質問(https://stackoverflow.com/q/45791960/407651)のように、要素が名前空間にあるという事実は無視しています。 – mzjn

答えて

1

元のルート要素にe-list要素の新しいコピーを何度も何度も追加しています。代わりに、新しいルート要素を作成してそれに追加する必要があります。 for文

import xml.etree.ElementTree as ET 

utree = ET.parse('v1.xml') 
newroot = ET.Element("lsm") 

for elist in utree.iter('e-list'): 
    for ename in elist.iter('e-name'): 
     if (ename.text == 'noEvent' or 'Event'): 
      newroot.append(elist) 

ET.ElementTree(newroot).write('v2.xml', xml_declaration=True, encoding='UTF-8') 
+0

ありがとう@mzjn私のために完全に動作します。 – tgcloud

関連する問題