2008-12-16 69 views
1

我想要做的只是对指定的根元素作出反应。例如,如果用户发送如下所示的XmlStream:XmlStream.addObserver中的XPath无法正常工作

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

我的方法._auth应该执行。我用addObserver方法在connectionMade方法内调用了它。

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

AFAIK XPath的 - 如果我写“/身份验证”这意味着我希望我的根元素为“身份验证”,这样的消息:

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

...应该被拒绝,因为auth不是root。

但是Twisted却不能按我认为应该的方式工作 - 当第二条消息出现时(auth元素在树中),我的_auth方法被执行,而不是第一条 - auth元素作为根。

所以,我的问题是:如何告诉Twisted和addObserver方法,我只想在根元素的名称是“auth”时才会作出反应?

回答

1

好吧,最后我得到了答案。这是因为XmlStream本身。只要主根元素未关闭,连接就处于活动状态(例如:<stream/>)。它里面的一切都是XPath的根元素,这就是为什么“/ auth”意味着<stream><auth></auth></stream>