0

我正在为 xmpp 客户端创建一个测试,并且我需要在此过程中使用不同的自定义节。我有两个问题想知道你们是否可以帮助我:

  1. 正如我所提到的,我将使用几个具有相同名称但名称空间不同的节。此节也可以是两级或更多,这是一个示例:

第 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

第 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’&gt;
      <metadata  path=' ' />
   </item>
 </aa>
</iq>

问题 1:如何创建两个以上级别的节?

  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 上工作。任何帮助表示赞赏!

此致,

4

1 回答 1

0

对于您关于具有相同名称的多个节的问题,plugin_attrib重要的是值,因为这将区分您的两个节。现在看起来你已经使用'aa'plugin_attrib导致冲突的节和最后注册的节获胜。

通常,我们在这些情况下使用命名空间的一部分。例如,对于迪斯科,有两个query元素的名称空间http://jabber.org/protocol/disco#infohttp://jabber.org/protocol/disco#items. 因此,这两个节具有相同的name、不同的namespace值,并且分别具有 和的plugin_attrib值。'disco_info''disco_items'

看起来您可以使用名称aa_profileaa_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值)。

——兰斯

于 2012-06-26T17:29:00.367 回答