0

XMPPサーバーに接続すると、次の2つの応答のいずれかが表示されます。

<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>

私のコードで2番目のものを解析しようとすると、次のエラーが発生します。

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 に答える