XPath в XMLStream.addObserver работает не так, как следовало бы
Вопрос
Что я хочу сделать, так это реагировать только на указанные корневые элементы.Например, если пользователь отправляет 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 в качестве root.
Итак, мой вопрос заключается в следующем:как сообщить методу Twisted и addObserver, что я хочу реагировать, только если имя корневого элемента "auth"?
Решение
Ладно, наконец-то я получил ответ.Это из-за самого XMLStream.Соединение активно до тех пор, пока основной корневой элемент не закрыт (например: <stream/>
).Все, что находится внутри, является корневым элементом для XPath, вот почему "/auth" означает <stream><auth></auth></stream>
.