import xml.sax import threading import Queue import time xml_filename = "/Users/dalke/Music/iTunes/iTunes Music Library.xml" #xml_text = "DallasSanta Fe" class ThreadedContentHandler(xml.sax.ContentHandler): def __init__(self, queue): self.queue = queue def startDocument(self): self.queue.put( ("startDocument", None) ) def startElement(self, tag, attrib): self.queue.put( ("startElement", (tag, attrib)) ) def characters(self, text): self.queue.put( ("characters", text) ) def endElement(self, tag): self.queue.put( ("endElement", tag) ) def endDocument(self): self.queue.put( ("endDocument", None) ) def iterParse(filename): queue = Queue.Queue() handler = ThreadedContentHandler(queue) th = threading.Thread(target=xml.sax.parse, args=(filename, handler)) th.setDaemon(True) th.start() while 1: data = queue.get() yield data if data[0] == "endDocument": break def main(): for (event, args) in iterParse(xml_filename): if event == "startElement": tag, attrib = args #print "start", repr(tag), dict(attrib.items()) elif event == "characters": #print "text", repr(args) pass elif event == "endElement": #print "end", repr(args) pass if __name__ == "__main__": t1 = time.time() main() t2 = time.time() print t2-t1