用于在python中解析(流式传输)XML的非阻塞方法

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的复杂性.

Pet*_*son 8

潜入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)

在我的情况下,我最终从扭曲的数据中提供数据,但它也应该与非阻塞套接字一起使用.