0

xmpp クライアントのテストの作成に取り組んでおり、途中でさまざまなカスタム スタンザを使用する必要があります。皆さんが私を助けてくれるかどうか疑問に思っていた 2 つの問題があります。

  1. 前述したように、名前が同じで名前空間が異なるいくつかのスタンザを使用します。また、このスタンザは 2 レベル以上にすることができます。以下に例を示します。

スタンザ 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: 2 レベルを超えるスタンザを作成するにはどうすればよいですか?

  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: 個別に処理するにはどうすればよいですか?

パイソンに取り組んでいます。どんな助けでも大歓迎です!

よろしくお願いします、

4

1 に答える 1

0

同じ名前の複数のスタンザについての質問についてはplugin_attrib、2 つのスタンザを区別するものであるため、重要なのは値です。現在、競合につながる'aa'両方のスタンザに使用したようで、最後に登録されたスタンザが勝ちます。plugin_attrib

通常、これらの状況では名前空間の一部を使用します。たとえば、disco にはquery、名前空間http://jabber.org/protocol/disco#infoとを持つ 2 つの要素がありますhttp://jabber.org/protocol/disco#items。そのため、2 つのスタンザは同じname、異なるnamespace値を持ち、それぞれ とplugin_attribの値を持ちます。'disco_info''disco_items'

名前aa_profileなどを使用しaa_muc_shareて問題を解決できるようです。

他の質問については、より多くのスタンザ オブジェクトが必要なようです。1 つは外部レベルのコンテナ スタンザを提供し、もう 1 つは個々のサブアイテムを管理します。以下を使用して、これを機能させることができます。

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 に答える