#! /usr/bin/python from xml.sax import saxexts, saxlib, saxutils import sys, urllib, string from saxparse import DocumentHandler, ErrorHandler, ParseHandler from stack import Stack class ObjectBase: def __init__(self): self.list = [] def getattributes(self, attrs): for key in attrs.keys(): self.handledata(key, attrs[key]) def getelementattributes(self, attrs): pass def handledata(self, tagname, data): pass def add(self, newobj): self.list.append(newobj) class ObjectClassFactory: def __init__(self): pass def CreateObject(self, name): """Create the object specified by name or None if none""" return ObjectBase() def CreateTopObject(self): """Create the top level object for the class hierarchy before parsing begins""" return ObjectBase() class ObjectDocumentHandler(DocumentHandler): def __init__(self, myfactory=ObjectClassFactory()): DocumentHandler.__init__(self) self.__factory = myfactory self.__elementstack = Stack() self.__objstack = Stack() self.topobj = self.__factory.CreateTopObject() if self.topobj != None: self.__objstack.push(self.topobj) self.debug = 0 def createObject(self, name): "Create appropriate Python object for XML object" newobj = self.__factory.CreateObject(name) if newobj == None: if self.debug: print "Unprocessed element ", name return(newobj) def handleStartElement(self, name, attrs): newobj = self.createObject(name) if newobj != None: if len(self.__objstack) > 0: oldgroup = self.__objstack.peek() oldgroup.add(newobj) newobj.getattributes(attrs) self.__objstack.push(newobj) self.__elementstack.push(1) else: oldobj = self.__objstack.peek() oldobj.getelementattributes(name, attrs) self.__elementstack.push(0) def startElement(self, name, attrs): DocumentHandler.startElement(self, name, attrs) self.handleStartElement(name, attrs) def handleEndObject(self, name): if self.__elementstack.pop(): self.__objstack.pop() def endElement(self, name): DocumentHandler.endElement(self, name) self.handleEndObject(name) def handleData(self, data): tagname = string.join(self.start_tag['name']) if self.debug: print "got %s = %s" % (tagname, data) if len(self.__objstack) > 0: oldobj = self.__objstack.peek() oldobj.handledata(tagname, data) def handleCharacters(self, data): self.handleData(data) class ObjectParseHandler(ParseHandler): def MakeHandler(self): return ObjectDocumentHandler() if __name__ == '__main__': parsehandler = ObjectParseHandler() if not parsehandler.RunAndCatch(sys.argv[1]): sys.exit(1)