xml aggregator

Fredrik Lundh fredrik at pythonware.com
Mon Jul 10 17:53:01 EDT 2006


kepioo wrote:
> Hi all,
> 
> I am trying to write an xml aggregator, but so far, i've been failing
> miserably.
> 
> what i want to do :
> 
> i have entries, in a list format :[[key1,value],[key2,value],[
> key3,value]], value]
> 
> example :
> [["route","23"],["equip","jr2"],["time","3pm"]],"my first value"]
>  [["route","23"],["equip","jr1"],["time","3pm"]],"my second value"]
>  [["route","23"],["equip","jr2"],["time","3pm"]],"my third value"]
>  [["route","24"],["equip","jr2"],["time","3pm"]],"my fourth value"]
>  [["route","25"],["equip","jr2"],["time","3pm"]],'"my fifth value"]
> 
>   the tree i want in the end would be :

assuming that the actual order of the subelements doesn't matter, you 
could simply sort the array, and use groupby to group related tags:

import elementtree.ElementTree as ET
import itertools, operator

data = [
     ([["route","23"],["equip","jr2"],["time","3pm"]],"my first value"),
     ([["route","23"],["equip","jr1"],["time","3pm"]],"my second value"),
     ([["route","23"],["equip","jr2"],["time","3pm"]],"my third value"),
     ([["route","24"],["equip","jr2"],["time","3pm"]],"my fourth value"),
     ([["route","25"],["equip","jr2"],["time","3pm"]],"my fifth value")
     ]


def group(data, index):
     return itertools.groupby(sorted(data), lambda x: x[0][index])

root = ET.Element("result")

for key, items in group(data, 0):
     route = ET.SubElement(root, key[0], id=key[1])
     for key, items in group(items, 1):
	equip = ET.SubElement(route, key[0], id=key[1])
	for key, items in group(items, 2):
	    time = ET.SubElement(equip, key[0], id=key[1])
	    for data in items:
		ET.SubElement(time, "data").text = data[1]

ET.dump(root)

if you want prettyprinted output, use this function

     http://effbot.org/zone/element-lib.htm#prettyprint

on the resulting tree.

</F>




More information about the Python-list mailing list