首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Swiften中使用自定义XML属性

如何在Swiften中使用自定义XML属性
EN

Stack Overflow用户
提问于 2014-10-25 23:05:49
回答 1查看 199关注 0票数 0

我目前正在开发一个基于XMPP的系统,该系统由一个iOS应用程序、一个ejabberd服务器和一个独立的客户端组成,它充当控制器,可以接收用户的请求并采取相应的行动(我知道IQ分节,但在Erlang开发ejabberd模块是我力所能及的)。

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

代码语言:javascript
复制
<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读取自定义属性时失败了,更不用说生成自定义消息了。

我试过两种方法。第一种方法是从消息中获取原始XML并使用boost XML获取属性,但我甚至无法将RawXMLPayload从消息中提取出来。

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

我怎样才能做到这一点?能用Swiften做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-26 08:58:06

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

代码语言:javascript
复制
<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中这样做,您可以在元素/(复制粘贴任何现有的PayloadParser )下添加一个新的有效负载,创建一个新的PayloadSerializer (请参阅Parser/PayloadParser/)和PayloadSerializer(请参阅序列化程序/PayloadSerializers),然后将它们分别添加到各自的工厂中--参见http://swift.im/swiften/guide/#Section-Extending

如果您确实必须将属性添加到节的顶层(请不要),则需要编辑元素/消息类,并修改解析器/MessageParser和序列化器/MessageSerializer。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26568169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档