2015-08-21 68 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

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