2012-07-05 168 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”的前缀定义是这类问题的一个症状。