from lxml import etree class betterdict(dict): def __getattr__(self, key): return self.get(key) st = [ betterdict({'text': ['1. Case gdfh ', ''], 'x0': '28.921', 'y0': '710.377'}), betterdict({'text': ['Version ', ' 0', ''], 'x0': '54.721', 'y0': '695.792'}), betterdict({'text': ['AER Number ', ' 4735986', ''], 'x0': '54.721', 'y0': '688.112'}), betterdict({'text': ['Initial Unit ', 'SBFBKJSF ', ''], 'x0': '54.721', 'y0': '680.792'}), betterdict({'text': ['2. Patient', ''], 'x0': '28.921', 'y0': '561.937'}), betterdict({'text': ['Patient Information', ''], 'x0': '54.721', 'y0': '510.697'}), betterdict({'text': ['Age ', ' 60 Years', ''], 'x0': '54.721', 'y0': '496.112'}), betterdict({'text': ['Height ', ' 171 Centimeter', ''], 'x0': '54.721', 'y0': '488.432'}), ] root = etree.Element('root') member = None for j in st: if j.x0 == '28.921': member = etree.SubElement(root, 'member') member.attrib['x0'] = j.x0 member.attrib['y0'] = j.y0 member.attrib['text'] = j.text[0] elif member is not None: submbr = etree.SubElement(member, 'sub') submbr.attrib['x0'] = j.x0 submbr.attrib['y0'] = j.y0 submbr.textattrib['text'] = j.text[0] submbr.text = j.text[1] out = etree.tostring(root) print(out)
<root> <member x0="28.921" y0="710.377" text="1. Case gdfh "> <sub x0="54.721" y0="695.792">Version792" <text="Version "> 0</sub> <sub x0="54.721" y0="688.112">AER112" text="AER Number <"> 4735986</sub> <sub x0="54.721" y0="680.792">Initial792" text="Initial Unit ">SBFBKJSF </sub> </member> <member x0="28.921" y0="561.937" text="2. Patient"> <sub x0="54.721" y0="510.697">Patient697" Information<text="Patient Information"></sub> <sub x0="54.721" y0="496.112">Age112" <text="Age "> 60 Years</sub> <sub x0="54.721" y0="488.432">Height432" <text="Height "> 171 Centimeter</sub> </member> </root>