您要做的是为您的节创建一个自定义节类。这是一个适用于您的示例的示例:
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 内容的引用。
set 是本节提供的用于提取信息的interfaces
一组键名,就像使用字典一样。例如,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 帮助的 slim@conference.jabber.org 聊天室。