smack源码分析前期准备——XmpPullParser


smack主要封装了xmpp协议,提供更方便的api去操作xmpp协议,具体详细可以到这边文章了解: http://www.cnblogs.com/not-code/archive/2011/07/16/2108369.html

鉴于xmpp协议都是以xml格式来传输,因此源码中解析协议都是用到XmpPullParser来解析xml。因此本文先介绍XmpPullParser的用法,在下一章就分析smack源码是如何解析xmpp协议,如何封装,以及如何扩展出自己定的协议。

XmpPullParser很简单,先简单介绍几个比较常用的方法:

 

<span style="margin: 0px; padding: 0px; color: rgb(63, 127, 95);">       //定义一个事件采用回调方式,直到xml完毕
        </span><span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">public int </span>getEventType() <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">throws </span>XmlPullParserException ;
        <span style="margin: 0px; padding: 0px; color: rgb(63, 127, 95);">//遍历下一个事件,返回一个事件类型
        </span><span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">public int </span>next() <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">throws </span>XmlPullParserException, IOException
        <span style="margin: 0px; padding: 0px; color: rgb(63, 127, 95);">//得到当前tag的名字
        </span><span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">public </span>String getName();
        <span style="margin: 0px; padding: 0px; color: rgb(63, 127, 95);">//获得当前文本
        </span><span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">public </span>String getText();
        <span style="margin: 0px; padding: 0px; color: rgb(63, 127, 95);">//当前tag下的属性数量
        </span><span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">public int </span>getAttributeCount() ;
        <span style="margin: 0px; padding: 0px; color: rgb(63, 127, 95);">//获得当前指定属性位置的名称
        </span><span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">public </span>String getAttributeName(<span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">int </span>index);
        <span style="margin: 0px; padding: 0px; color: rgb(63, 127, 95);">//获得当前指定属性位置的值
        </span><span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">public </span>String getAttributeValue(<span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">int </span>index);
 
为了更好的理解后面的源码,我用了源码其中一段代码来分析:
 
<span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">public </span>PacketExtension parseExtension(XmlPullParser parser) <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">throws </span>Exception {
               MUCUser mucUser = <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">new </span>MUCUser();
               <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">boolean </span>done = <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">false</span>;
               <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">while </span>(!done) {
                   <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">int </span>eventType = parser.next();
                   <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">if </span>(eventType == XmlPullParser.START_TAG) {
                       <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">if </span>(parser.getName().equals(<span style="margin: 0px; padding: 0px; color: rgb(42, 0, 255);">"invite"</span>)) {
                           mucUser.setInvite(parseInvite(parser));
                       }
                       <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">if </span>(parser.getName().equals(<span style="margin: 0px; padding: 0px; color: rgb(42, 0, 255);">"item"</span>)) {
                           mucUser.setItem(parseItem(parser));
                       }
                       <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">if </span>(parser.getName().equals(<span style="margin: 0px; padding: 0px; color: rgb(42, 0, 255);">"password"</span>)) {
                           mucUser.setPassword(parser.nextText());
                       }
                       <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">if </span>(parser.getName().equals(<span style="margin: 0px; padding: 0px; color: rgb(42, 0, 255);">"status"</span>)) {
                           mucUser.setStatus(<span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">new </span>MUCUser.Status(parser.getAttributeValue(<span style="margin: 0px; padding: 0px; color: rgb(42, 0, 255);">""</span>, <span style="margin: 0px; padding: 0px; color: rgb(42, 0, 255);">"code"</span>)));
                       }
                       <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">if </span>(parser.getName().equals(<span style="margin: 0px; padding: 0px; color: rgb(42, 0, 255);">"decline"</span>)) {
                           mucUser.setDecline(parseDecline(parser));
                       }
                       <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">if </span>(parser.getName().equals(<span style="margin: 0px; padding: 0px; color: rgb(42, 0, 255);">"destroy"</span>)) {
                           mucUser.setDestroy(parseDestroy(parser));
                       }
                   }
                   <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">else if </span>(eventType == XmlPullParser.END_TAG) {
                       <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">if </span>(parser.getName().equals(<span style="margin: 0px; padding: 0px; color: rgb(42, 0, 255);">"x"</span>)) {
                           done = <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">true</span>;
                       }
                   }
               }

               <span style="margin: 0px; padding: 0px; color: rgb(127, 0, 85);">return </span>mucUser;
           }

 

里面的对象先不用理它,我们只需看他是如何分析这段xml的:

//协议解释,从123456789发送一段协议给12345678这个用户,邀请用户123456789进入房间,理由hi join us。(说明这段协议只是我根据以前的经验想出来的,具体可能不是这样简单)

<message id="WEzG6-11" to="123456789@xxx-pc/Smack" from="12345678@xxx-pc/Smack" type="get">

<x xmlns="http://jabber.org/protocol/muc#user">

<invite to="123456789@xxx-pc">

<reason>hi join us</reason>

</invite>

</x>

</message>

parser.next(); 获得第一个事件,判断是否开始标签(XmlPullParser.START_TAG),然后再里面判断每个标签的名字,处理完后判断结尾标签(XmlPullParser.END_TAG)是否需要结束本次循环。

 

//取xmlpullparse对象

  1. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
  2. XmlPullParser parser = factory.newPullParser(); 

 

//设置关联数据源(重点,在下一章里面所有数据的获取就是通过Reader渠道)

parser.setInput(reader);

 

OK,介绍完毕,下一章是分析android smack源码接收消息以及如何解析消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值