0

连接到 XMPP 服务器时,我得到以下两个响应之一:

<stream:features xmlns:stream="http://etherx.jabber.org/streams">
    <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
       <mechanism>PLAIN</mechanism>
       <mechanism>DIGEST MD5</mechanism>
    </mechanisms>
    <auth xmlns="http://jabber.org/features/iq-auth" />
    <register xmlns="http://jabber.org/features/iq-register" />
</stream:features>

或者

<stream:features>
    <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
        <mechanism>DIGEST-MD5</mechanism>
        <mechanism>PLAIN</mechanism>
        <mechanism>ANONYMOUS</mechanism>
        <mechanism>CRAM-MD5</mechanism>
    </mechanisms>
    <compression xmlns="http://jabber.org/features/compress">
        <method>zlib</method>
    </compression>
    <auth xmlns="http://jabber.org/features/iq-auth" />
    <register xmlns="http://jabber.org/features/iq-register" />
</stream:features>

当试图用我的代码解析第二个时,我得到了这个错误:

namespace error : Namespace prefix stream on features is not defined
<stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism
                ^

这是我的代码:

mechanisms = []

xmlParsed = libxml2.parseDoc(xmlResponse)

xpathContext = xmlParsed.xpathNewContext()
xpathContext.xpathRegisterNs('urn','http://etherx.jabber.org/streams')
xpathContext.xpathRegisterNs('sasl', 'urn:ietf:params:xml:ns:xmpp-sasl')
nodes = xpathContext.xpathEval("//urn:stream/features/sasl:mechanisms/sasl:mechanism/text()|//urn:features/sasl:mechanisms/sasl:mechanism/text()")
for node in nodes:
    mechanisms.append(str(node))

我做错了什么,我该如何纠正?请不要说,使用 XMPP 库之类的,我不是要写一个完整的 XMPP 客户端。我只想要足够的代码先注册为用户。

4

2 回答 2

2

请不要从头开始编写自己的 XMPP 库。xmpp.org上的列表中已经有很多可用的。特别是对于 Python,请尝试SleekXMPP

例如,使用 parseDoc 是行不通的;您需要逐步解析 XML。“stream:features”中“stream”的前缀定义缺失是这类问题的症状。

于 2012-07-05T07:11:28.467 回答
1

我认为该<stream:features>标签报告了错误,指出stream未定义前缀。

<stream:features>表示features标记位于前缀表示的命名空间下,stream并且在您的 xml 片段中没有声明这样的命名空间。

于 2012-07-05T04:38:13.123 回答