2010-04-30 7 views
3

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() 

Répondre

2

Vous devez utiliser un analyseur basé sur la poussée qui émet des événements SAX. Fondamentalement, vous voulez un analyseur que vous pouvez appeler pushChunk (données) avec un bit partiel de données, et avoir un gestionnaire d'événement pour l'événement de premier enfant tag de fin qui génère vos strophes. Cela peut ensuite être envoyé à la logique de traitement de l'application.

Si vous voulez voir un exemple, voici l'analyseur expat pour libstrophe, une bibliothèque client XMPP je l'ai écrit: http://github.com/metajack/libstrophe/blob/master/src/parser_expat.c

Construire un document entier pour chaque strophe est assez cher. Il est possible de l'implémenter avec une instance d'analyseur unique, par opposition à la création de nouveaux analyseurs de document pour chaque strophe.

Si vous avez besoin d'une version Python fonctionnelle, vous pouvez probablement utiliser ou retirer le code de Twisted Words (twisted.words.xish je crois).

+0

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. –

+0

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

1

Ce que nous avons fait pour Skates est que nous utilisons un analyseur Sax pour construire le flux, mais utiliser cet analyseur pour générer un document entier pour chaque strophe reçu.

Questions connexes