你想要做的是为你的节创建一个自定义节类。这里有一个会为你有例子的工作:
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实例。 –