你想要做的是爲你的節創建一個自定義節類。這裏有一個會爲你有例子的工作:
from sleekxmpp import Iq
from sleekxmpp.xmlstream import ElementBase, register_stanza_plugin
class AA(ElementBase):
name = 'aa'
namespace = 'http://myweb.com'
plugin_attrib = 'aa'
interfaces = set(['name', 'lang', 'mail'])
sub_interfaces = interfaces
register_stanza_plugin(Iq, AA)
好了,那麼所有的能行嗎? name
字段指定XML對象的根標記爲'aa',namespace
指定根標記的名稱空間;我希望迄今爲止顯而易見。
plugin_attrib
字段是可用於從父節段訪問此節的名稱。例如,您應該已經熟悉如何使用iq['type']
或iq['from']
從Iq節中提取數據。使用plugin_attrib
設置爲"aa"
,則可以使用iq['aa']
來獲取對AA內容的引用。
interfaces
set是本節提供的用於提取信息的鍵名集,就像處理字典一樣。例如,一個Iq節在它的接口集中有'to','from','type'等。默認情況下,訪問和修改這些鍵將創建或修改節的主要元素的屬性。所以,在這一點上,你的節應該這樣的表現:
aa = AA()
aa['name'] = 'foo'
print aa
"<aa xmlns='http://myweb.com' name='foo' />"
現在,它映射界面鍵子元素而不是屬性,他們需要在sub_interfaces
集。因此,通過設置sub_interfaces = interfaces
上面的例子,現在將工作像這樣:
aa = AA()
aa['name'] = 'foo'
print aa
"<aa xmlns='http://myweb.com'><name>foo</name></aa>"
如果你需要的東西更先進的,你也可以定義表單的get_ */SET_ */del_ *,其中*是接口的方法名,其將被用於提取或修改數據。
因此,所有一起,你將能夠做到:
iq = Iq()
# ... set iq parameters
iq.enable('aa') # Add an initial, empty aa element.
try:
resp = iq.send()
print(resp['aa']['name'])
# ..., etc
except XMPPError:
print('There was an error')
另外,不要忘記,我們有SleekXMPP幫助[email protected]聊天室如果你需要它。
首先,tnx蘭斯爲這個詳細的答案。這真的幫助我從我閱讀的所有信息中獲得想法。 我試着用你的信息+我在網上找到的東西,我得到這個: 'class OO(ElementBase): name ='aa' namespace ='http:// myweb。COM/' plugin_attrib = 'AA' 接口=組([ '名稱', '郎', '郵件']) sub_interfaces =接口 DEF getMail(個體): 存在= self.xml.find(' {%s} mail'%self.namespace) return present' 它什麼都不做 – BarbSchael
我想知道是否必須以某種方式在我的__main__上「調用」AA類。如果是這樣,如何...因爲然後我試過這個: aa = AA() iq.enable('aa') 嘗試: resp = iq.send() print(resp ['aa'] ['name ] 除了XMPPError: 打印(「有錯誤」) 並沒有任何反應,以及再次 感謝 問候, – BarbSchael
首先,不要忘了register_stanza_plugin(IQ,AA)調用從上面的最後一個例子。!。在發送初始狀態並請求名單之後,它將運行在session_start事件的事件處理程序中,echo_client.py示例是一個很好的起點,只需要進行一次小的更正,而不是iq = Iq(),它需要是iq = self.Iq(),其中self是ClientXMPP實例。 –