Python: transform equal XML elements into nested children-parent elements -
i hope can me solve following problem.
i have ugly , large xml file looks this:
<root> <level-0/> <level-1/> <level-2/> <level-3/> <level-1/> <level-3/> <level-2/> </root> i need automatically transform follows:
<root> <level-0> <level-1> <level-2> <level-3/> </level-2> </level-1> <level-1> <level-3/> <level-2/> </level-1> </level-0> </root> note not sub-level has immediate parent actual parent. in other words, nesting rule is: each element has nested within latter element has higher level of nesting itself.
please consider i've used xml.etree large piece of code, , keeping way awesome - still, if it'll necessary switch package, lxml, will.
any kind of muchly appreciated. thank you.
edit.
this have far kind of works:
from xml.etree import elementtree et level_0 = [] level_1 = [] level_2 = [] level_3 = [] l0 = l1 = l2 = l3 = 0 tree = et.parse("ugly.xml") ugly = tree.getroot() new = et.element("root") e in ugly: if e.tag == "l0": new.append(e) l0 += 1 level_0.append(e) l1 = l2 = l3 = 0 elif e.tag == "l1": if l1: if l0: level_0[-1].append(e) else: new.append(e) l1 += 1 level_1.append(e) l2 = l3 = 0 elif e.tag == "l2": if l2: if l1: level_1[-1].append(e) elif l0: level_0[-1].append(e) else: new.append(e) l2 += 1 level_2.append(e) l3 = 0 elif e.tag == "l3": level_3.append(e) if l2: level_2[-1].append(e) elif l1: level_1[-1].append(e) elif l0: level_0[-1].append(e) else: new.append(e) level in level_1: new.append(level) else: level in level_2: new.append(level) else: level in level_3: new.append(level) the problem levels note appendend.
edit 2:
maybe got it!
def appendeep(parent, child): def level(elem): levels = ["level-0", "level-1", "level-2", "level-3"] return levels.index(elem.tag) try: if level(child) > level(parent[-1]): parent[-1] = appendeep(parent[-1], child) else: parent.append(child) except indexerror: parent.append(child) return parent tree = et.parse("ugly.xml") ugly = tree.getroot() new = et.element("root") e in ugly: new = appendeep(new, e)
Comments
Post a Comment