Skip to content

Instantly share code, notes, and snippets.

@davidszotten
Created August 22, 2013 21:40
Show Gist options
  • Select an option

  • Save davidszotten/6313167 to your computer and use it in GitHub Desktop.

Select an option

Save davidszotten/6313167 to your computer and use it in GitHub Desktop.
socket server for parsing streaming xml
""" 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