我有一个通过套接字传入的 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)
我想 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)
在我的例子中,我最终从 twisted 向它提供数据,但它也应该与非阻塞套接字一起工作。
关于python - python中解析(流)XML的非阻塞方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1459648/