【问题标题】:Cannot Read Custom Attributes From Message TAG when using asmack XMPP library for android?使用 android 的 asmack XMPP 库时无法从消息标签中读取自定义属性?
【发布时间】:2012-09-09 08:38:55
【问题描述】:

这是我想要接收的从 XMPP 服务器端发送的 XML,以便我可以将其发送到我的 XML 解析器。

<message to="39@domainname.com/smack" chat_id="73392" 
       custom_packet="true" user_id="44" manager_id="39" time_stamp="0" website_id="0" 
       visitor_name="John" end_time="False" xml:lang="en-us" type="groupchat" 
       from="room73392@conference.domainname.com/39">
       <body>Hello</body> 
       <x xmlns="http://jabber.org/protocol/muc#user"> 
       <status xmlns="" code="0"/>   
       </x></message>

这是我正在接收的示例 XML。 当我使用 p.toXML(); //包p

 <message to="44@domainname.com/Smack" 
    from="room73407@conference.domainname.com/Visitor1171" type="groupchat">
    <body>Hello</body>
    <delay xmlns="urn:xmpp:delay"></delay>
    <x xmlns="jabber:x:delay" stamp="20120917T05:57:19" 
    from="4732abb5@domainname.com/4732abb5">
    </x></message>

我刚刚开始使用 XMPP 服务器。因此,任何指导都会受到赞赏。

【问题讨论】:

  • 永远不要为 XMPP 顶级元素发明自己的属性。另见XEP-134 2.1。而是添加扩展名&lt;myextension xmlns='myns'&gt;&lt;chat_id name='24214'/&gt;/&lt;/myextension&gt;

标签: android xmpp smack xmppframework asmack


【解决方案1】:
do {
    ParseEvent event=parser.read();
    ParseEvent pe;

    switch(event.getType()){
        case Xml.START_TAG:
        if (event.getName().toString().equals("message")){
                int xx=event.getAttributeCount();

                String _s2=event.getAttribute("to").getValue();
                if(_s2=="" || _s2==null){
                    _s2="N/A";
                }

                String _s3=event.getAttribute("from").getValue();       
                if(_s3=="" || _s3==null){
                    _s3="N/A";
                }

                String _s4=event.getAttribute("type").getValue();
                if(_s4=="" || _s4==null){
                    _s4="N/A";
                }

                String _s1=_s2+"~~"+_s3+"~~"+_s4;
                m_result.add(new BeanClassName(_s1));                   
        }
        (...)
    }
}

您可以通过为每个案例添加开始标记然后在bean Class中设置值来读取您的属性。

【讨论】:

  • 这个 bean 类在哪里。我的意思是在哪个 Asmack 源代码包中?
  • @SherazKhilji 所以需要我为你贴上一个 bean 类
  • 请。我是 XMPP 的新手,所以请
  • 先生 上面的代码用于编写 XML 解析器,我想接收自定义 XML 数据包。我已经有一个 XML 解析器。请再次阅读问题
  • 对此很抱歉,但使用我上面编辑的代码,您可以在 xml 中接收属性的值
【解决方案2】:

如果不修改源代码,您无法在 Smack(以及 aSmack)中执行此操作。它只会解析标准的 Message 节,因此您的所有自定义属性都将被忽略。 XMPP 中的正确方法是创建标准数据包的扩展,而不是修改它们。如果您可以控制从服务器发送的内容,那么您应该更改为消息添加自定义扩展的方法,从而更改此

<message to="39@domainname.com/smack" chat_id="73392" 
 custom_packet="true" user_id="44" manager_id="39" time_stamp="0" 
 website_id="0" visitor_name="John" end_time="False" xml:lang="en-us" 
 type="groupchat" from="room73392@conference.domainname.com/39">
   <body>Hello</body>
   <x xmlns="http://jabber.org/protocol/muc#user">
      <status xmlns="" code="0"/>
   </x>
</message>

到这里

<message to="39@domainname.com/smack" chat_id="73392" xml:lang="en-us" 
 type="groupchat" from="room73392@conference.domainname.com/39">
   <body>Hello</body>
   <x xmlns="http://jabber.org/protocol/muc#user">
      <status xmlns="" code="0"/>
   </x>
   <custom xmlns="my:namespace:custom" user_id="44" manager_id="39" time_stamp="0" 
 website_id="0" visitor_name="John" end_time="False"/>
</message>

然后您可以轻松编写自己的提供程序来解析自定义数据包扩展名,并通过调用简单地检索您的自定义对象(由您的解析器创建)

MyExtension customStuff = message.getExtension("my:namespace:custom");

您可以查看EmbeddedExtensionProvider 以非常轻松地编写您的提供程序。

【讨论】:

  • 罗宾在这里。你问错问题了。但是,请注意您使用的命名空间 URI; “my:”不是您控制的已注册 URI 前缀。如果你不打算做标准,你控制的 http:// URL 可以用作保证唯一的 URI。
  • 感谢您的回复。所以我必须为此修改服务器端代码。我无法从 Message Stanza 中提取属性。
  • 我已经通过修改源代码解决了这个问题。有关如何执行此操作的更多详细信息,这里是链接。 stackoverflow.com/questions/12475122/…
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多