如何使用Swiften自定义XML属性

时间:2014-10-25 23:05:50

标签: c++ xmpp swiften

我目前正在开发一个基于XMPP的系统,该系统由一个iOS应用程序,一个ejabberd服务器和一个独立客户端组成,该客户端充当控制器,可以接收用户的请求并采取相应的操作(我知道智商stanzas,但在Erlang中开发ejabberd模块远远超出了我的联盟。)

对于我正在使用XMPPFramework的iOS应用程序,对于控制器我选择了Swiften,因为它是这里最推荐的C ++库。由于这不仅仅是一个普通的消息传递系统,我发现需要在消息中包含一些自定义属性,如下所示:

<message type="chat" 
         to="controller@example" 
         custom_attribute_1="Value 1"
         custom_attribute_2="Value 2"
    <subject>Subject</subject>
    <body>Body</body>
    <thread>Thread</thread>
</message>

使用XMPPFramework非常容易,但是我在尝试使用Swiften读取自定义属性时失败了,更不用说生成自定义消息了。

我尝试了两种方法。第一个是从消息中获取Raw XML并使用boost XML Parser获取属性,但我甚至无法从消息中获取RawXMLPayload

我认为最后的第二种方法是分析Swift / Swiften代码,以了解它们如何管理整个XML到对象的转换。我知道他们使用AttributeMap类,但我不知道这些对象是怎么来的,所以也没有运气。

我怎样才能做到这一点?可以使用Swiften完成吗?

1 个答案:

答案 0 :(得分:0)

我强烈建议不要在节的顶层添加额外的属性(这是可能的,但你必须命名元素,许多实现都不会对此感到满意 - 你给出的例子是非法的XMPP,因为属性在默认命名空间中)。向节添加附加信息的常规方法是添加(命名空间)有效负载,如下所示:

<message type="chat" 
     to="controller@example">
    <subject>Subject</subject>
    <body>Body</body>
    <thread>Thread</thread>
    <chrispayload xmlns="...blah..." custom_attribute_1="Value 1" custom_attribute_2="Value 2"/>
</message>

要在Swiften中执行此操作,您需要在Elements /下添加新的Payload(复制粘贴任何现有的Payload),创建新的PayloadParser(请参阅Parser / PayloadParsers /)和PayloadSerializer(请参阅Serializer / PayloadSerializers),然后将其中的每一个添加到各自的工厂 - 请参阅http://swift.im/swiften/guide/#Section-Extending

如果你真的必须将属性添加到节的顶层(并且请不要),你想要编辑Elements / Message类,并修改Parsers / MessageParser和Serializers / MessageSerializer