Что я хочу сделать, так это реагировать только на определенные корневые элементы. Например, если пользователь отправляет XmlStream, который выглядит так:
<auth>
<login>user</login>
<pass>dupa.8</pass>
</auth>
Мой метод._auth должен быть выполнен. Я сделал это с помощью метода addObserver, который вызывается внутри метода connectionMade.
self.addObserver("/auth", self._auth)
AFAIK XPath - если я пишу "/auth", это означает, что я хочу, чтобы мой корневой элемент был "auth", так что сообщение:
<longtagislong>
<auth>...</auth>
</longtagislong>
... должен быть отклонен, поскольку auth не является root.
Но Twisted, однако, не работает так, как я думал, это нужно - мой метод _auth выполняется, когда появляется второе сообщение (с элементом auth внутри дерева), а не первое - с элементом auth в качестве корня.
Итак, мой вопрос: как сказать метод Twisted и addObserver, который я хочу отреагировать, только если имя корневого элемента "auth"?
Хорошо, наконец, я получил ответ. Это из-за самого XmlStream. Соединение активно, пока основной корневой элемент не закрыт (например: <stream/>
). Все внутри него является корневым элементом для XPath, поэтому "/auth" означает <stream><auth></auth></stream>
.