Вывод элементов определённого тега в 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

Могу предложить просто пробежаться по всем дочерним элементам.

  1. Встретили тег spisok
  2. Сохраняем id тега spisok
  3. Встретили тег act, проверяем текущее id
  4. Условие выполняется?
  5. Если да, то добавляем в список 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]
→ Ссылка