您的位置:首页 > 其它

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

2011-07-31 22:17 211 查看
smack主要封装了xmpp协议,提供更方便的api去操作xmpp协议,具体详细可以到这边文章了解:/article/5680341.html

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

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

 

//定义一个事件采用回调方式,直到xml完毕
public int getEventType() throws XmlPullParserException ;
//遍历下一个事件,返回一个事件类型
public int next() throws XmlPullParserException, IOException
//得到当前tag的名字
public String getName();
//获得当前文本
public String getText();
//当前tag下的属性数量
public int getAttributeCount() ;
//获得当前指定属性位置的名称
public String getAttributeName(int index);
//获得当前指定属性位置的值
public String getAttributeValue(int index);


 


为了更好的理解后面的源码,我用了源码其中一段代码来分析:


 


public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
MUCUser mucUser = new MUCUser();
boolean done = false;
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("invite")) {
mucUser.setInvite(parseInvite(parser));
}
if (parser.getName().equals("item")) {
mucUser.setItem(parseItem(parser));
}
if (parser.getName().equals("password")) {
mucUser.setPassword(parser.nextText());
}
if (parser.getName().equals("status")) {
mucUser.setStatus(new MUCUser.Status(parser.getAttributeValue("", "code")));
}
if (parser.getName().equals("decline")) {
mucUser.setDecline(parseDecline(parser));
}
if (parser.getName().equals("destroy")) {
mucUser.setDestroy(parseDestroy(parser));
}
}
else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals("x")) {
done = true;
}
}
}

return 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对象

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  

XmlPullParser parser = factory.newPullParser(); 

 

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

parser.setInput(reader);

 

OK,介绍完毕,下一章是分析android smack源码接收消息以及如何解析消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: