Python:ElementTree If Else Condition

时间:2015-08-21 06:58:08

标签: python xml if-statement elementtree

我想用条件打印值: 如果IsRecommended.text为true,则它将仅在同一树中打印该值。 但结果现在是打印包含IsRecommended.text的所有值都是false。

<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))

我的代码中有错误吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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))