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

Popular posts from this blog

routing - AngularJS State management ->load multiple states in one page -

python - GRASS parser() error -

json - Gson().fromJson(jsonResult, Myobject.class) return values in 0's -