代码之家  ›  专栏  ›  技术社区  ›  balu

解析类似于XMPP的XML流的最佳方法?

  •  4
  • balu  · 技术社区  · 16 年前

    我正在开发一个服务器应用程序,该应用程序通过类似于XMPP的XML格式的TCP套接字接收数据,即 <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 回复  |  直到 16 年前
        1
  •  2
  •   metajack    16 年前

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

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

    为每一节构建一个完整的文档是相当昂贵的。可以用一个解析器实例来实现这一点,而不是为每个节不断地生成新的文档解析器。

    如果您需要一个有效的Python版本,您可能可以使用或从扭曲的单词(twisted.words.xish,我相信)中提取代码。

        2
  •  1
  •   Julien Genestoux    16 年前

    我们做了什么 Skates 我们使用一个SAX解析器来构建流,但是使用这个解析器为接收到的每个节构建一个完整的文档。