我正在为xmpp客户端创建测试,我需要在此过程中使用不同的自定义节。我有两个问题,我想知道你们是否可以帮助我:
STANZA 1
<iq type='result' to= 'chat.com' id='id1'>
<aa xmlns='http://mysite.com/profile' >
<name>My name as included in sent mails<name>
<lang>en</lang>
<mail>My mail as included in sent mails</mail>
<fbuserid>46736473231<fbuserid>
<fbaccesstoken>AAAAA84257YTRRIXTEQITXXTCMTVBTTBXU<fbaccesstoken>
<photo_url>http://pic.facebook.com/photo.jpg</photo_url>
</aa>
</iq>
我创建了自定义节,如下所示:
name = 'aa'
namespace = 'http://mysite.com/profile'
plugin_attrib = 'aa'
interfaces = set(('name', 'lang', 'mail', 'fbuserid', 'fbaccesstoken', 'photo_url'))
sub_interfaces = interfaces
STANZA 2
<iq type='set' to= 'roomname@conference.chat.come' id='id1'>
<aa xmlns='http://mysite.com/muc#share'>
<item name='Falda tubo' thumbnail='http://webpage.info/falda_tn.jpg' id='itemid1' action='add' url='http://webpage.info/falda.html’>
<metadata path=' ' />
</item>
</aa>
</iq>
问题1:如何创建超过两个级别的节?
正如你所看到的,我的节有相同的名字,但更改了命名空间,这给了我一些麻烦,因为我创建了get_ *和set_ *等方法来处理信息,但它正在执行:
register_stanza_plugin(Iq, stanza_profile)
register_stanza_plugin(Iq, stanza_rooms)
def start(self, event):
self.send_presence()
self.get_parameters()
self.set_parameters()
这会记录两个节,但仅在最后一个节点执行操作(stanza_rooms)
问题2:我如何单独处理?
使用python。任何帮助表示赞赏!
致以最诚挚的问候,
答案 0 :(得分:0)
对于有关同名的多个节的问题,plugin_attrib
值很重要,因为这将区分您的两个节。现在看起来你已经使用'aa'
用于两个stanza的plugin_attrib
导致冲突并且最后一个注册的节获胜。
通常,我们在这些情况下使用命名空间的一部分。例如,对于disco,有两个query
元素,其名称空间为http://jabber.org/protocol/disco#info
和http://jabber.org/protocol/disco#items
。因此,这两个节具有相同的name
,不同的namespace
值,并且plugin_attrib
值分别为'disco_info'
和'disco_items'
。
看起来您可以使用名称aa_profile
和aa_muc_share
或类似名称来解决问题。
对于您的其他问题,看起来您想要的是更多的节对象。一个提供外层容器节,另一个管理一个单独的子项。您可以使用以下方法完成此工作:
class InnerStanza(ElementBase):
name = 'inner'
namespace = 'example'
plugin_attrib = 'inner'
plugin_multi_attrib = 'inner_items'
...
register_stanza_plugin(OuterStanza, InnerStanza, iterable=True)
通过上述内容,您可以访问outer['inner_items']
以获取与InnerStanza类匹配的内部实体列表(因为plugin_multi_attrib
值)。
- Lance