Мне нужно вернуть ничего, когда элемент дерева не может найти тег в XML - PullRequest
0 голосов
/ 26 марта 2020

XML приведено ниже

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

Мне нужна функция для возврата None, когда я использую метод find для поиска тега 'year'.

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. Мне просто нужна функция для возврата None, когда она не находит 'year' в файле XML.

1 Ответ

0 голосов
/ 28 марта 2020

Не удивительно, что ваш код не удался. data - это список узлов, поэтому вы можете применять ElementTree методы, например, к каждому элементу этого списка, а не ко всему списку сам по себе.

Еще одна деталь, из-за которой ваш код не прошел:

  • в вашей XML выборке стране является элемент root ,
  • вы пытаетесь найти другой элемент страны внутри него (но такого элемента нет).

Если вы хотите найти элемент country в дереве XML, он должен быть где-то глубже .

Для моего примера я использовал следующее XML (как строковая переменная txt ):

<main>
  <country>
    <name>London</name>
    <rank>1</rank>
    <gdppc>141100</gdppc>
  </country>
  <country>
    <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

Подробности:

  • Внешний для l oop перебирает список, полученный из вашего кода.
  • Внутренний l oop перебирает дочерние элементы каждого элемента этого списка.
  • Если текущий дочерний элемент является элементом year , возвращается его текст («положительный» регистр).
  • Если ничего не найдено, Нет возвращается («отрицательный» случай).

При запуске:

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

Результат:

None
1980

Таким образом, у вас есть оба «отрицательный» и «положительный» результат для различных значений rank .

Edit

Последнее предложение вашего сообщения: Мне просто нужна функция для возврата Нет, когда он не находит «год» в файле XML.

Так что, если вам не важно его расположение в дереве XML, достаточно вызвать root.findtext('.//year') :

Чтобы проверить "отрицательный" и "положительный" регистр, выполните:

print(root.findtext('.//x_year'))
print(root.findtext('.//year'))

Результат такой же, как указано выше.

...