XmpPullParser
鉴于xmpp协议都是以xml格式来传输,因此源码中解析协议都是用到XmpPullParser来解析xml
XmpPullParser很简单,先简单介绍几个比较常用的方法
//定义一个事件采用回调方式,直到xml完毕
public int getEventType() throwsXmlPullParserException ;//遍历下一个事件,返回一个事件类型
public int next() throwsXmlPullParserException, IOException//得到当前tag的名字
publicString getName();//获得当前文本
publicString getText();//当前tag下的属性数量
public intgetAttributeCount() ;//获得当前指定属性位置的名称
public String getAttributeName(intindex);//获得当前指定属性位置的值
public String getAttributeValue(int index);
View Code
为了更好的理解后面的源码,加一段代码来分析:
public PacketExtension parseExtension(XmlPullParser parser) throwsException {
MUCUser mucUser= newMUCUser();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;
}
}
}returnmucUser;
}
View Code
里面的对象先不用理它,只需看他是如何分析这段xml的:
//协议解释,从123456789发送一段协议给12345678这个用户,邀请用户123456789进入房间,理由hi join us。
hi join us
View Code
parser.next();
获得第一个事件,判断是否开始标签(XmlPullParser.START_TAG)
然后再里面判断每个标签的名字
处理完后判断结尾标签(XmlPullParser.END_TAG)是