2008-12-16 5 views
1

Ce que je veux faire est de ne réagir que sur les éléments racine spécifiés. Par exemple, si l'utilisateur envoie XMLStream qui ressemble à:XPath dans XmlStream.addObserver ne fonctionne pas comme il le devrait

<auth> 
    <login>user</login> 
    <pass>dupa.8</pass> 
</auth> 

Ma méthode ._auth doit être exécuté. Je l'ai fait avec la méthode addObserver appelée à l'intérieur de la méthode connectionMade.

self.addObserver("/auth", self._auth) 

AFAIK XPath - si j'écris "/ auth" cela signifie que je veux que mon élément racine d'être "auth", de sorte que ce message:

<longtagislong> 
    <auth>...</auth> 
</longtagislong> 

... devrait être rejeté, parce que auth n'est pas root. Mais Twisted ne fonctionne pas comme je le souhaitais - ma méthode _auth est exécutée quand le second message apparaît (avec l'élément auth dans l'arbre), pas le premier - avec l'élément auth comme racine. Donc, ma question est: comment dire à la méthode Twisted et addObserver que je veux réagir seulement si le nom de l'élément racine est "auth"?

Répondre

1

Ok, enfin j'ai eu la réponse. C'est à cause de XmlStream lui-même. La connexion est active tant que l'élément racine principal n'est pas fermé (par exemple: <stream/>). Tout ce qu'il contient est un élément racine pour XPath, c'est pourquoi "/ auth" signifie <stream><auth></auth></stream>.

Questions connexes