在为Android使用asmack XMPP库时,无法从消息标签中读取自定义属性?

时间:2012-09-17 06:22:32

标签: android xmpp smack xmppframework asmack

这是我想要接收的从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服务器。所以任何指导都会受到赞赏。

2 个答案:

答案 0 :(得分:4)

你不能在没有修改源代码的情况下在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,轻松编写您的提供商。

答案 1 :(得分:-2)

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类中设置值来读取属性。