#!/usr/bin/env python import xml.dom.minidom import time import sys def dom_debug (node,level): print level,'<<< dom_debug 1>>>',node.nodeType # print level,'<<< dom_debug 2>>>',dir(node) # print level,'<<< dom_debug 4>>>',node.nodeValue for child in node.childNodes: dom_debug (child,level+1) print level,'<>',len(node.childNodes) # returns node's value - tries to be flexible def dom_get_text (node): # dom_debug(node,0) if node.nodeType == node.TEXT_NODE: return node.data elif node.nodeType == node.ELEMENT_NODE and len(node.childNodes) == 1: return dom_get_text(node.childNodes[0]) elif node.nodeType == node.ELEMENT_NODE: return 'dom_get_text: element does not have 1 child' return "" class SlicesParse: def __init__ (self, filename): self.filename=filename impl = xml.dom.minidom.getDOMImplementation() self.dom = impl.createDocument (None, 'slices', None) def load (self): self.doc = xml.dom.minidom.parse(self.filename) def scan_rspecs (self): slices = {} for slice in self.doc.getElementsByTagName('slice'): rspecs = [] resources = slice.getElementsByTagName('rspec')[0] for resource in resources.getElementsByTagName('resource'): value=resource.getElementsByTagName('value')[0] rspecs.append({ 'name': value.getAttribute('name'), 'type':value.getAttribute('type'), 'value':dom_get_text(value) } ) if rspecs: slices [slice.getAttribute('name')] = rspecs return slices if __name__ == '__main__': for filename in sys.argv[1:]: export = SlicesParse(filename) start = time.time() export.load() now = time.time() print 'parsing : %d seconds'%(now-start) start=now slices=export.scan_rspecs() now = time.time() print 'scanning : %d seconds'%(now-start) start=now storage=open(filename+".bin","wb") import pickle pickle.dump(slices,storage) storage.close() print 'storage : %d seconds'%(now-start) start=now