解析类似XMPP的XML流的最佳方法是什么?

时间:2010-04-30 00:37:34

标签: python xml stream xmpp network-protocols

我正在研究一种服务器应用程序,它通过TCP套接字以类似XMPP的XML格式接收数据,即<root>元素的每个子元素基本上代表一个单独的请求(节)。收到</root>后立即关闭连接。 我知道我必须以某种方式使用像SAX这样的流解析器。虽然为了方便起见,我更喜欢使用树状界面来访问每个节的子元素。 (每个请求发送的数据都不大,所以我认为从整体上阅读每一节是有意义的。)

在Python(最好是v3)中实现这一目标的最佳方式是什么?

这是我想要构建它的代码。请随意指出一个完全不同的方向来解决这个问题。

import socketserver
import settings

class MyServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

class MyRequestHandler(socketserver.StreamRequestHandler):
    def handle(self):
        pass

if __name__ == '__main__':
    server = MyServer((settings.host, settings.port), MyRequestHandler)
    server.serve_forever()

2 个答案:

答案 0 :(得分:2)

您需要使用基于推送的解析器来发出SAX事件。基本上你需要一个解析器,你可以使用部分数据调用pushChunk(data),并为它生成一个生成你的节的第一级子结束标记事件的事件处理程序。然后可以将其发送到应用程序处理逻辑。

如果你想看一个这样的例子,这里是libstrophe的expat解析器,我写的XMPP客户端库: http://github.com/metajack/libstrophe/blob/master/src/parser_expat.c

为每个节构建一个完整的文档非常昂贵。可以使用单个解析器实例实现此功能,而不是为每个节连续创建新的文档解析器。

如果你需要一个可用的Python版本,你可以使用或从Twisted Words中提取代码(twisted.words.xish我相信)。

答案 1 :(得分:1)

我们为Skates所做的是我们使用Sax解析器来构建流,但是使用此解析器为每个收到的节构建一个完整的文档。