Вывод элементов определённого тега в xml дереве
Есть xml-дерево примерно такого содержания:
<uslist>
<spisok id="1" name="Важные дела" />
<act name="Важное дело" />
<act name="Ещё важное дело" />
<spisok id="2" name="Не очень важные дела" />
<act name="Неважное дело" />
<act name="Ещё неважное дело" />
</uslist>
Мне нужно осуществить вывод элементов act выбранного списка. То есть
как мне вывести элементы тега с id = 2?
@bot.callback_query_handler(func=lambda call: call.data.startswith("list_"))
def list_selected(call):
list_id = call.data[5:]
try:
root = lxml.etree.parse('remain.xml')
except FileNotFoundError:
print("Файл remain.xml не найден.") # Логирование в консоль
return None # Возвращаем None в случае ошибки
acts = []
for result in root.xpath(f"//spisok[@id='{list_id}']"):
for act_element in result.findall('act'):
act_name = act_element.get('name')
acts.append(act_name)
if not acts:
bot.send_message(
call.from_user.id,
"У вас пока нет дел в этом списке",
reply_markup=list_menu
)
list_of_acts = types.InlineKeyboardMarkup(row_width=2)
for act_name in acts:
list_of_acts.add(
types.InlineKeyboardButton(
text=act_name,
callback_data=f"act_{act_name}"
)
)
tree.write("remain.xml", encoding="utf-8")
Своим умом дошёл только до этого решения, но оно не работает.
Ответы (1 шт):
Автор решения: Amgarak
→ Ссылка
Могу предложить просто пробежаться по всем дочерним элементам.
- Встретили тег spisok
- Сохраняем id тега spisok
- Встретили тег act, проверяем текущее id
- Условие выполняется?
- Если да, то добавляем в список acts содержимое тега act.
import xml.etree.ElementTree as ET
xml = """
<uslist>
<spisok id="1" name="Важные дела" />
<act name="Важное дело" />
<act name="Ещё важное дело" />
<spisok id="2" name="Не очень важные дела" />
<act name="Неважное дело" />
<act name="Ещё неважное дело" />
</uslist>
"""
root = ET.fromstring(xml)
acts = []
spisok_id = None
for child in root:
if child.tag == "spisok":
spisok_id = child.attrib.get("id")
if spisok_id == "2" and child.tag == "act":
acts.append(child.attrib.get("name"))
print(acts)
Вывод:
['Неважное дело', 'Ещё неважное дело']
[Program finished]