Здесь лучше использовать l xml.
Определить следующую функцию:
def getParentNames(nd):
res = []
while True:
itm = nd.attrib.get('item')
if itm is not None:
res.append(itm)
res.append(nd.tag) # Current tag name
nd = nd.getparent() # Go 1 level up
if nd is nd.getroottree().getroot(): # Stop before the root node
res.reverse()
return ' '.join(res)
Возвращает имена всех родительских узлов, как Список, разделенный пробелами, но если какой-то узел имеет атрибут item , значение этого атрибута добавляется в этот список.
Я заметил, что вы просто вставляете атрибут item это «особый способ», поэтому я выбрал только вышеприведенное решение.
Но если у вас есть другие «исключения», касающиеся особой обработки некоторых атрибутов, измените вышеуказанную функцию соответствующим образом.
Затем выведите вышеприведенные «пути» и текстовые значения всех листьев узлов:
for nd in root.iter():
if len(nd.getchildren()) == 0: # Leaf nodes only
print(f'{getParentNames(nd)}: {nd.text}')
Результат:
Audio DefaultVolume: 70
Audio Input HDMI 3 Level: -12
Audio Input HDMI 3 Mode: On
Audio Input HDMI 3 VideoAssociation MuteOnInactiveVideo: On