Je travaille sur une application serveur qui reçoit des données sur un socket TCP dans un format XML de type XMPP, c'est-à-dire que chaque enfant de l'élément <root>
représente essentiellement une requête séparée (strophe). La connexion est fermée dès que </root>
est reçu. Je sais que je dois utiliser un analyseur de flux comme SAX, en quelque sorte. Bien que, par commodité, je préfère avoir une interface arborescente pour accéder aux éléments enfants de chaque strophe. (Les données envoyées avec chaque requête ne sont pas grandes donc je pense qu'il est logique de lire chaque strophe dans son ensemble.)Meilleure façon d'analyser les flux XML de type XMPP?
Quelle est la meilleure façon de réaliser cela en Python (de préférence v3)?
C'est le code que je voudrais construire en. Ne hésitez pas à me diriger dans une direction tout à fait différente pour résoudre ce problème.
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()
Une autre astuce consiste à utiliser un seul pointeur d'élément comme pile pour votre position actuelle. Lorsque vous obtenez un nouvel événement d'élément, vous créez un élément dans votre dom. Si la pile n'est pas nulle, vous ajoutez cet élément en tant qu'enfant à l'élément de pile et définissez le pointeur de pile sur le nouvel élément. Lorsque vous obtenez un événement d'élément de fin, vous définissez le pointeur de pile sur le parent du pointeur de pile en cours. Si le pointeur de la pile est nul à la fin de cette opération, vous avez une strophe. Note: c'est ce que le code de Jack lié à ci-dessus fait plus ou moins. –
Juste au cas où quelqu'un aurait besoin d'une solution Python pour celui-ci: http://stackoverflow.com/questions/1459648/non-blocking-method-for-parsing-streaming-xml-in-python (le message marqué comme réponse acceptée) . – balu