使用子节点获取父节点 lxml python

1 投票
1 回答
1481 浏览
提问于 2025-04-18 04:34

对于这个 xml 文件,

 xmldata="""
    <locations>

    <continent region="Africa" >
        <country id="84" countryname="Algeria" ></country>
    </continent>

    <continent region="Asia" >
        <country id="84" countryname="India" ></country>
    </continent>

    <continent region="America" >
        <country id="84" countryname="Mexico" ></country>
    </continent>

</locations>
"""

我想通过国家名称来获取地区名称。如果国家名称是 India,那么代码应该返回 Asia

我尝试过的方式是,

import lxml.etree as ET
root = ET.fromstring(xmldata)
flag=False
continent=""
country=""
for neighbor in root.iter('continent'):
    for i in neighbor.iter("country"):
        if i.attrib.get('countryname')=="India":
            flag=True
            continent=neighbor.attrib.get('region')
            country=i.attrib.get('countryname')
    if flag==True:
        break
print 'Continent is ',continent , 'And country is ', country

这个代码可以运行,但这样做不太方便。

我该如何使用 xpath 表达式来实现这个目标呢?

1 个回答

1

使用这个 xpath 表达式://continent[./country/@countryname="India"]/@region

>>> import lxml.etree as ET
>>> xmldata="""
... <locations>
... 
... <continent region="Africa" >
...     <country id="84" countryname="Algeria" ></country>
... </continent>
... 
... <continent region="Asia" >
...     <country id="84" countryname="India" ></country>
... </continent>
... 
... <continent region="America" >
...     <country id="84" countryname="Mexico" ></country>
... </continent>
... 
... </locations>
... """
>>> root = ET.fromstring(xmldata)
>>> print root.xpath('//continent[./country/@countryname="India"]/@region')
['Asia']

撰写回答