我想用条件打印值: 如果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))
我的代码中有错误吗?我该如何解决这个问题?
答案 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))