使用if和Python打印XML文件结果



我有这个XML文件,我试图打印所有拥有rank == 2的国家。此外,我正在尝试打印所有neighbor == E的国家。

<?xml version="1.0"?>
<data>
<country>
<countryname>Canada</countryname>
<rank>2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor> E</neighbor>       
</country>
<country>
<countryname>USA</countryname> 
<rank>1</rank>
<year>2010</year>
<gdppc>121100</gdppc>
<neighbor> A</neighbor>       
</country>
<country>
<countryname>Mexico</countryname>
<rank>2</rank>
<year>2011</year>
<gdppc>131100</gdppc>
<neighbor>E</neighbor>       
</country>
<country>
<countryname>France</countryname>
<rank>1</rank>
<year>2018</year>
<gdppc>191100</gdppc>
<neighbor> A</neighbor>       
</country>
<country>
<countryname>Italy</countryname>
<rank>2</rank>
<year>2020</year>
<gdppc>181100</gdppc>
<neighbor> E</neighbor>       
</country>
</data>

目前为止我尝试的if语句:

for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank == 2:
print(rank)
for country in root.findall('country'):
neighbor = text(country.find('neighbor').text)
if neighbor == E:
print(neighbor)

但是我得到这个错误:

if rank ==4:
IndentationError: unexpected indent

我不知道如何打印我的if报表的结果,请帮助。

谢谢! !

如果您已经决定使用.findall(),您可以传递XPath表达式,它将返回属于<country>节点的<countryname>节点,在<rank>子节点中具有某些文本(在本例中为2)。

import xml.etree.ElementTree as ET
# root initialization
for element in root.findall("./country[rank='2']/countryname"):
print(element.text)

您可以在xml.etree.ElementTree模块中找到更多关于XPath支持的信息。注意,它只支持基本的缩写语法。如果需要使用XPath的扩展功能,请查看lxml

例如,标准的ElementTree功能不足以解决基于<neighbor>节点的相同任务,因为它可能包含前导空间。使用lxml我们可以解决这个问题:

from lxml import etree
# root initialization
print(*root.xpath("./country[contains(neighbor, 'E')]/countryname/text()"), sep="n")

我正试图打印所有拥有rank == 2的国家。此外,我试图打印所有国家的neighbor == E

使用ElementTree,下面的代码打印neighbor == E or rank == 2

出现的国家名称
import xml.etree.ElementTree as ET

xml = '''<?xml version="1.0"?>
<data>
<country>
<countryname>Canada</countryname>
<rank>2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor> E</neighbor>       
</country>
<country>
<countryname>USA</countryname> 
<rank>1</rank>
<year>2010</year>
<gdppc>121100</gdppc>
<neighbor> A</neighbor>       
</country>
<country>
<countryname>Mexico</countryname>
<rank>2</rank>
<year>2011</year>
<gdppc>131100</gdppc>
<neighbor>E</neighbor>       
</country>
<country>
<countryname>France</countryname>
<rank>1</rank>
<year>2018</year>
<gdppc>191100</gdppc>
<neighbor> A</neighbor>       
</country>
<country>
<countryname>Italy</countryname>
<rank>2</rank>
<year>2020</year>
<gdppc>181100</gdppc>
<neighbor> E</neighbor>       
</country>
</data>'''
root = ET.fromstring(xml)
country_lst = [c.find('countryname').text for c in root.findall('.//country') if c.find('neighbor').text.strip() == 'E' or c.find('rank').text == '2']
print(country_lst)

输出
['Canada', 'Mexico', 'Italy']

相关内容

  • 没有找到相关文章

最新更新