在XMPP中交换自定义XML元素的最佳方法?

在XMPP中交换自定义XML元素的最佳方法?,xml,xmpp,Xml,Xmpp,我有一个XMPP应用程序,其中有两个客户端进行交互(1)一个用Scala/Java编程的机器人(bot)和(2)一个用Javascript编程的GUI聊天客户端 应用程序需要交换自定义XML(例如,如下所示) 234 交换数据的最佳方式是什么?以下是我能想到的: 1) 编写自定义XMPP节 2) 将我的XML嵌入当前定义的节(例如,在消息或iq中) 3) 对于smack 第3条)被排除在外,因为它要求两个客户端都理解Java对象并使用相同的库(Smack) 请告诉我关于同一问题的任何其他问题

我有一个XMPP应用程序,其中有两个客户端进行交互(1)一个用Scala/Java编程的机器人(bot)和(2)一个用Javascript编程的GUI聊天客户端

应用程序需要交换自定义XML(例如,如下所示)


234
交换数据的最佳方式是什么?以下是我能想到的:

1) 编写自定义XMPP节

2) 将我的XML嵌入当前定义的节(例如,在消息或iq中)

3) 对于smack

第3条)被排除在外,因为它要求两个客户端都理解Java对象并使用相同的库(Smack)

请告诉我关于同一问题的任何其他问题


[编辑:]在做了一些研究之后,我发现数据表单(XEP-0004)是最简单的方法,只要您的库支持它

这在很大程度上取决于数据的使用方式。我的经验法则是,如果我只传递键值对(简单数据),那么我会选择Smack中的属性特性。但属性功能只能在消息中使用。出于某种原因,属性扩展不使用Smack的提供程序体系结构,而是将其硬编码到
Packet
PacketParserUtils
类中。所以如果你不能在IQ或状态信息包中重用它

如果您要使用的不仅仅是键值对,那么您应该为自定义节编写一个提供程序。这是一项工作,但一旦实现了编组/解编组,那么您的自定义节在Smack框架中几乎无处不在。有关详细信息,请参见SMACK


我在我的一个博客中写了关于写作提供者的博客。这不是本文的主要信任,但希望您也能发现它的帮助。

使用各自XMPP节中的子元素和您自己的命名空间从客户机发送自定义xml数据。例如。这样的节的将依次由您的客户端bot接收,而不需要任何其他配置。感谢您的评论。我最终决定在数据表单中使用子元素。我发现数据表单(XEP-004)在smack中并不完全完整。最好使用自定义编码(例如,消息节中的JSON)。这就是我们最终在各地所做的。谢谢你的回答。我认为Smack属性特性仅限于Smack代码,因此这不是一个好的选择。我将检查提供者体系结构以实现自己的节。博客条目很有用。
<myPacket>
   <response type='sensorData'>
      <temperature units='Kelvin'>
         234
      </temperature>
   </response>
</myPacket>