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