2015-08-21 66 views
0

如果IsRecommended.text爲true,我希望打印值爲條件: ,它將只在相同的樹中打印值。 但現在的結果是它打印所有的值包括IsRecommended.text是錯誤的。Python:ElementTree如果其他條件

<Settings> 
     <Setting>     
      <Address>15:0</Address> 
      <Comments /> 
      <Conditions /> 
      <IsSingleEnded>true</IsSingleEnded> 
      <IsVisibilityExternal>false</IsVisibilityExternal> 
      <MetaDatas /> 
      <SettingName>123</SettingName> 
     </Setting> 
     <Setting>     
      <Address>18:0</Address> 
      <Comments /> 
      <Conditions /> 
      <IsSingleEnded>true</IsSingleEnded> 
      <IsVisibilityExternal>false</IsVisibilityExternal> 
      <MetaDatas /> 
      <SettingName>abc</SettingName> 
     </Setting> 
     <Strings> 
      <String> 
      <value>1</value> 
      <IsRecommended>false</IsRecommended> 
      </String> 
      <String> 
      <value>2</value> 
      <IsRecommended>true</IsRecommended> 
      </String> 
     </Strings> 
    </Setting> 
</Settings> 

這裏是我的代碼:

from xml.etree import ElementTree 

with open('abc.xml', 'rt') as f: 
    tree = ElementTree.parse(f) 
    #address1 = tree.findall('.//Address') 
    #print address1.node.tag 

with open("expected.txt", "w") as text_file: 
    for setting in tree.findall('.//Setting'): 
     address = setting.find('./Address') 
     setting_name = setting.find('./SettingName') 
     strings = setting.find('./Strings') 
     is_recommended = None 
     for string in strings.findall('./String'): 
      for is_recommended in string.findall('./IsRecommended'): 
       for value in strings.findall('.//value'): 
        if is_recommended is not None and is_recommended.text == 'true': 
         print value.text 
         text_file.write("{} {} {}\n".format(setting_name.text, address.text, value.text)) 

我的代碼中的任何錯誤?我怎麼解決這個問題?

回答

0

您的xml示例似乎格式錯誤,您正在關閉<Setting>標記,但您尚未將其打開。假設這只是一個複製粘貼錯誤,因爲你說你得到輸出文件中的所有值。

實際的問題是線 -

for value in strings.findall('.//value'): 

每個String標籤裏面,你再次從其父Strings,這是不對的檢查值,您需要檢查僅從String標籤值。如果您確定每個String標籤都只有1個值和1個IsRecommended標籤,則不需要循環。你可以做 -

from xml.etree import ElementTree 

with open('abc.xml', 'rt') as f: 
    tree = ElementTree.parse(f) 
    #address1 = tree.findall('.//Address') 
    #print address1.node.tag 

with open("expected.txt", "w") as text_file: 
    for setting in tree.findall('.//Setting'): 
     address = setting.find('./Address') 
     setting_name = setting.find('./SettingName') 
     strings = setting.find('./Strings') 
     if strings is not None: 
      for string in strings.findall('./String'): 
       is_recommended = string.find('./IsRecommended') 
       value = string.find('./value') 
       if is_recommended is not None and is_recommended.text == 'true': 
        print value.text 
        text_file.write("{} {} {}\n".format(setting_name.text, address.text, value.text)) 
+0

對不起?你是什​​麼意思重複鍵?你在哪裏看到鑰匙? –

+0

再一次,抱歉,但我不明白你在說什麼,你可能想先看看元素樹文檔 - https://docs.python.org/2/library/xml.etree.elementtree.html。它是一個用於xml解析的模塊。 –

+0

''我看不到它在哪裏?你在哪裏看到? –