python - python中解析(流)XML的非阻塞方法

标签 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)

我想 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/

相关文章:

Java - 如何使用正则表达式修复格式错误的 JSON?

python - 在 matplotlib 图上嵌入小 map (cartopy)

python - 当我使用 pandas 的箱线图和子图时出现错误

ruby - 回形针远程 URL

xml - 在 coldfusion 中使用定义的模式解析 XML

C#如何使用字符串中的语句来解析文本

java - 计算父标签内的子标签

python - 在单个 `setup()` 中多次调用 `setup.py` 是否安全?

python - 升级 Pip 错误信息

xml - 如何生成没有尾部 "/"的XML标签?