【问题标题】:How to use custom XML attributes with Swiften如何在 Swiften 中使用自定义 XML 属性
【发布时间】:2014-12-21 11:41:10
【问题描述】:

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

对于 iOS 应用程序,我使用 XMPPFramework,对于控制器,我选择了 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 读取自定义属性时失败了,更不用说生成自定义消息了。

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

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

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

【问题讨论】:

标签: c++ xmpp swiften


【解决方案1】:

我强烈建议不要在节的顶层添加额外的属性(这是可能的,但您必须为元素命名,并且许多实现不会对此感到满意 - 您给出的示例是非法 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(复制粘贴任何现有的),创建一个新的 PayloadParser(请参阅 Parser/PayloadParsers/)和 PayloadSerializer(请参阅 Serializer/PayloadSerializers),然后将这些中的每一个添加到各自的工厂 - 请参阅http://swift.im/swiften/guide/#Section-Extending

如果您确实必须将属性添加到该节的顶层(请不要),您需要编辑 Elements/Message 类,并修改 Parsers/MessageParser 和 Serializers/MessageSerializer。

【讨论】:

  • 作为附加说明,您可以使用 iq stanzas 客户端到客户端,因此没有什么能阻止您将自定义命令作为 iqs 从移动设备到控制器 - 服务器不会关心,只会路由他们。
  • 不客气。文档确实比我想要的少,但欢迎大家在我们的 MUC 中提出这类问题,我们会尽力提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多