実行したいのは、スタンザのカスタムスタンザクラスを作成することです。これがあなたの例でうまくいくものです:
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スタンザからデータを使用iq['type']
または抽出する方法をすでに理解している必要があります。iq['from']
にplugin_attrib
設定すると、AAコンテンツへの参照を取得するために"aa"
使用できます。iq['aa']
この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ヘルプ用のsleek@conference.jabber.orgチャットルームがあることを忘れないでください。