Pet*_*son 7 python xml parsing nonblocking
我有一个XML文档通过套接字进入,我需要动态解析和响应(即解析部分树).我想要的是一种非阻塞方法,这样我就可以在等待更多数据进入时做其他事情(没有线程).
像iterparse这样的东西如果在读缓冲区为空时完成迭代将是理想的,例如:
context = iterparse(imaginary_socket_file_wrapper)
while 1:
for event, elem in context:
process_elem(elem)
# iteration of context finishes when socket has no more data
do_other_stuff()
time.sleep(0.1)
Run Code Online (Sandbox Code Playgroud)
我猜SAX也是一个选择,但iterparse似乎对我的需求来说更简单.有任何想法吗?
更新:
使用线程很好,但引入了我希望回避的复杂程度.我认为非阻塞调用是一种很好的方法,但我发现它增加了解析XML的复杂性.
潜入iterparse源为我提供了解决方案.下面是一个简单的示例,即动态构建XML树并在关闭标记后处理元素:
import xml.etree.ElementTree as etree
parser = etree.XMLTreeBuilder()
def end_tag_event(tag):
node = self.parser._end(tag)
print node
parser._parser.EndElementHandler = end_tag_event
def data_received(data):
parser.feed(data)
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我最终从扭曲的数据中提供数据,但它也应该与非阻塞套接字一起使用.