2012-07-05 108 views
0

當連接到一個XMPP服務器我得到這兩種反應之一:的XPath名稱空間問題

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

OR

<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客戶端。我只想讓足夠的代碼先註冊爲用戶。

回答

1

我認爲錯誤報告爲<stream:features>標籤說前綴stream未定義。

<stream:features>指示features標記位於由前綴stream表示的名稱空間下,並且在xml片段中沒有聲明此類名稱空間。

+0

關於「|」的評論是相當不正確的。 「|」運算符意味着「聯合」(兩個節點集合)。它在這個示例表達式中被完美地正確使用。因此降低了迴應。 –

+0

感謝您的糾正! –

2

請不要從頭編寫自己的XMPP庫。 xmpp.org上的列表中已有很多可用的選項。特別是,對於Python,請嘗試SleekXMPP

例如,使用parseDoc不會工作;您需要逐步解析XML。 「stream:features」中缺少「stream」的前綴定義是這類問題的一個症狀。