Created
August 22, 2013 21:40
-
-
Save davidszotten/6313167 to your computer and use it in GitHub Desktop.
socket server for parsing streaming xml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ socket server for parsing streaming xml | |
| based on | |
| http://stackoverflow.com/a/2270249/105043 and | |
| http://eventlet.net/doc/examples.html#echo-server | |
| usage: | |
| $ python iterxml.py & | |
| # push two documents to make sure we can start over | |
| $ cat sample.xml sample.xml |nc localhost 6000 | |
| """ | |
| import eventlet | |
| import xml.etree.ElementTree as etree | |
| class DoneParsing(Exception): | |
| pass | |
| class StreamHandler(object): | |
| # for example from http://www.w3schools.com/schema/schema_example.asp | |
| outer_element = 'shiporder' | |
| def reset(self): | |
| self.in_document = False | |
| self.parser = etree.XMLTreeBuilder() | |
| self.parser._parser.EndElementHandler = self.end_hander | |
| def handle(self, fd): | |
| self.reset() | |
| while True: | |
| data = fd.read(1) | |
| if not data: | |
| break | |
| if not self.in_document: | |
| # skip 'junk' betewen documents | |
| if data != '<': | |
| continue | |
| self.in_document = True | |
| try: | |
| self.parser.feed(data) | |
| except DoneParsing: | |
| self.reset() | |
| def end_hander(self, tag): | |
| node = self.parser._end(tag) | |
| print node, node.text | |
| if node.tag == self.outer_element: | |
| raise DoneParsing() | |
| print "server socket listening on port 6000" | |
| server = eventlet.listen(('0.0.0.0', 6000)) | |
| pool = eventlet.GreenPool() | |
| while True: | |
| try: | |
| new_sock, address = server.accept() | |
| print "accepted", address | |
| handler = StreamHandler() | |
| pool.spawn_n(handler.handle, new_sock.makefile('rw')) | |
| except (SystemExit, KeyboardInterrupt): | |
| break |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment