Вопрос : Как проверить условие во время синтаксического анализа XML
То, что вы делаете, это не парсинг, так как эта строка уже выполнила синтаксический анализ:
tree = ET.parse(file_name, parser=parser)
Вам не нужно передавать parser=XMLParser
, так как это стандартный синтаксический анализатор.
Читать для справки: xml.etree.ElementTree.parse
Ваш пример кода зацикливает ElementTree
ЧЕТЫРЕ ВРЕМЕНИ .
for ele in tree.findall('update'):
cveList = [
ele.find('references/reference').get('id') if ele.find('references/reference').get('type') == 'cve' else None
for cve in ele.find('references/reference')]
Каждый .find...
будет зацикливаться до тех пор, пока не найдет запрошенный элемент или до конца.
Вам следует избегать такого вложенного кодирования!
Вы можете получить все reference
элементов с помощью одной петли, например:
import xml.etree.ElementTree as ET
file_name = "test/updateinfo.xml"
tree = ET.parse(file_name)
cveList = []
for reference in tree.findall('update/references/reference'):
if reference.attrib.get('type') == 'cve':
cveList.append(reference.attrib.get('id'))
print(cveList)
Выход :
['CVE-2017-7793', 'CVE-2017-7810', 'CVE-2017-7814', 'CVE-2017-7818', 'CVE-2017-7819', 'CVE-2017-7823', 'CVE-2017-7824']
Комментарий : cveList для каждого элемента обновления вместо получения всех элементов в одном списке. Я хотел бы выполнять итерации в каждом обновлении и получать другие атрибуты
# Findall 'update' Elements in tree
for update in tree.findall('update'):
# Findall 'references/reference' in update
for reference in update.findall('references/reference'):
if reference.attrib.get('type') == 'cve':
# Find Element with tag <title> in update
title = update.find('title').text
# Append a Dict with keys 'title' and 'id'
cveList.append({'title': title, 'id': reference.get('id')})
Выход :
[{'id': 'CVE-2017-7793', 'title': 'Critical: firefox security update'}, {'id': 'CVE-2017-7810', 'title': 'Critical: firefox security update'}, {'id': 'CVE-2017-7814', 'title': 'Critical: firefox security update'}, {'id': 'CVE-2017-7818', 'title': 'Critical: firefox security update'}, {'id': 'CVE-2017-7819', 'title': 'Critical: firefox security update'}, {'id': 'CVE-2017-7823', 'title': 'Critical: firefox security update'}, {'id': 'CVE-2017-7824', 'title': 'Critical: firefox security update'}]
Протестировано с Python: 2.7.9