smack源码分析前期准备——XmpPullParser
来源:互联网 发布:东方国信java工资 编辑:程序博客网 时间:2024/06/05 10:39
鉴于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对象
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- XmlPullParser parser = factory.newPullParser();
//设置关联数据源(重点,在下一章里面所有数据的获取就是通过Reader渠道)
parser.setInput(reader);
OK,介绍完毕,下一章是分析android smack源码接收消息以及如何解析消息。
- xmpp smack源码分析前期准备——XmpPullParser【2】
- smack源码分析前期准备——XmpPullParser
- Mybatis3源码分析(01)-前期准备
- Android 源码学习笔记一——前期准备
- struts2源码解析--前期准备
- android源码编译前期准备
- Hadoop之——前期准备篇
- UI设计——前期准备
- mybatis简单案例源码详细【注释全面】——前期准备
- Qt模块化笔记之sql——前期准备
- 【Java Web小项目——招聘网站】前期准备
- 奋笔疾书C++之CareerCup——面试前期准备
- 第二周(2)——前期准备的结束
- 大数据可视化第一天——前期准备
- Openstack组件部署 — Overview和前期环境准备
- 前期准备
- 前期准备
- 前期准备
- 开发APP没有数据怎么办?
- android sdk 设置
- Form的高度有限制,form的高度只能比屏幕的高度大一点点
- cocos2d-x 3.5版 创建新工程
- android R文件无法自动生成
- smack源码分析前期准备——XmpPullParser
- dom4j 生成 xml
- 00-自测3. 数组元素循环右移问题 (20)
- printf()为什么有重入和性能上的问题?
- python代码风格-PEP8
- jsp 简化获取相对路径,Uploader文件上传
- 取出所有树形结构父节点下的子节点(用存储过程实现)
- smack源码分析——接收消息以及如何解析消息
- C# 索引器