当元素树无法在XML中找到标记时,我不需要返回任何内容

问题描述 投票:-1回答:1

下面给出的XML

<country >
    <name>London</name>
    <rank>1</rank>
    <gdppc>141100</gdppc>
</country>

当我使用None方法查找'year'标签时,我需要函数返回find

def get_age_by_name(rank):
  data = [a for a in root.findall('.//country') if a.find('rank').text == rank]
  year = data.find('year').tag
  return None

输出显示:

year = data.find('year').tag
AttributeError: 'list' object has no attribute 'find'

我确认'year'标记不在XML文件中。我只需要函数在XML文件中找不到“ year”时返回None

python xml find elementtree
1个回答
0
投票

您的代码失败也就不足为奇了。 数据列表节点,因此您可以应用ElementTree方法,例如上此列表的每个element,而不是整个列表本身。

您的代码失败的另一个细节是:

  • 在您的XML样本country中是root元素
  • 您试图寻找另一个 国家元素内部(但没有这样的元素。)>
  • 如果要在XML树中查找country

元素,则该元素必须在某处更深。

对于我的示例,我使用以下XML(作为字符串变量txt

):
<main>
  <country id="11">
    <name>London</name>
    <rank>1</rank>
    <gdppc>141100</gdppc>
  </country>
  <country  id="12">
    <name>Paris</name>
    <rank>2</rank>
    <gdppc>222200</gdppc>
    <year>1980</year>
  </country>
</main>

为了解析它,我跑了:

root = et.fromstring(txt)

然后定义您的功能,如下所示:

def get_age_by_name(rank):
    for node in [ a for a in root.findall('.//country') if a.find('rank').text == rank ]:
        for child in node:
            if child.tag == 'year':
                return child.text
    return None

详细信息:

  • 外部for循环遍历由您的代码。
  • 内部循环遍历此列表的每个元素的子代。
  • 如果当前子元素是year
  • 元素,则返回其文本(“正”例)。
  • 如果未找到任何内容,则返回None
  • (“负”情况)。

    运行时:

print(get_age_by_name('1'))
print(get_age_by_name('2'))

结果是:

None
1980

因此,对于不同的[[rank

值,您同时具有“负”和“正”结果。
© www.soinside.com 2019 - 2024. All rights reserved.