2008-12-16 264 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>