我有这个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']