Use the lxml method iterancestors().
from lxml import etree
doc = etree.fromstring(xml)
rval = {}
for org in doc.xpath('//orgID[text()="126"]'):
for ancestor in org.iterancestors('Department'):
id=ancestor.find('./orgID').text
name=ancestor.find('./name').text
rval[name]=id
print rval
exit:
{'A': '124', 'C': '126', 'B': '125'}
, dict, dict. OrderedDict :
doc = etree.fromstring(xml)
a = []
for org in doc.xpath('//orgID[text()="126"]'):
for ancestor in org.iterancestors():
if ancestor.find('./orgID') is not None:
id=ancestor.find('./orgID').text
name=ancestor.find('./name').text
elif ancestor.get('orgID'):
id=ancestor.get('orgID')
name=ancestor.get('name')
else:
continue
print id,name
a.append((name,id))
print "In order of discovery:\n ", a
print "From root to child\n ", [x for x in reversed(a)]
print "dict keys are not sorted\n ", dict(a)
:
126 C
125 B
124 A
123 xmllist
In order of discovery:
[('C', '126'), ('B', '125'), ('A', '124'), ('xmllist', '123')]
From root to child
[('xmllist', '123'), ('A', '124'), ('B', '125'), ('C', '126')]
dict keys are not sorted
{'A': '124', 'xmllist': '123', 'C': '126', 'B': '125'}