MainActivity.java

主入口,通过获得 XML文件 ,然后将解析后的文件标签以及文本内容拼接到 StringBuffer中,最后显示在TextView上

 package com.example.test_pullxml;

 import java.util.List;

 import com.test.MsgInfo.MsgInfo;
import com.test.Msgservice.Msgservice; import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;
import android.widget.Toast; /**
* @author daomul
*
*/
public class MainActivity extends Activity { TextView tv_showTextView=null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tv_showTextView = (TextView) this.findViewById(R.id.tv_show); try { List<MsgInfo> infos = Msgservice.getMsgInfos(MainActivity.class.getClassLoader()
.getResourceAsStream("test.xml")); //获得当前src 目录下的文件 StringBuffer sBuffer = new StringBuffer();
for (MsgInfo info : infos) { //将文件的内容 循环拼接到Stringbuffer中
String str = info.toString();
sBuffer.append(str);
sBuffer.append("\n");
} tv_showTextView.setText(sBuffer);//显示在textview上
Toast.makeText(this, "解析成功", Toast.LENGTH_LONG).show(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(this, "解析失败", Toast.LENGTH_LONG).show();
}
} }

Msgservice.java

通过新建一个解析器,然后初始化解析器,然后开始解析XML文件,通过特殊的解析器标签判定解析的时机和位置,

每结束一次列表的解析,就将它添加,循环添加。

 package com.test.Msgservice;

 import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.xmlpull.v1.XmlPullParser;
import android.util.Xml; import com.test.MsgInfo.MsgInfo; public class Msgservice { /**
* 利用解析器解析XML文件
* @param is
* @return
* @throws Exception
*
* XmlPullParser是解析器 xPsraer是解析的到得XML
*/
public static List<MsgInfo> getMsgInfos(InputStream is) throws Exception{ XmlPullParser xParser = Xml.newPullParser();//解析得到的xml //初始化解析器
xParser.setInput(is,"utf-8"); List<MsgInfo> msgInfos = null;
MsgInfo msgInfo = null;
int type = xParser.getEventType(); //解析出来的XML标签类 while (type != XmlPullParser.END_DOCUMENT) { switch (type) {
case XmlPullParser.START_TAG:
if ("msgs".equals(xParser.getName())) { // 解析到 全局开始的标签
msgInfos = new ArrayList<MsgInfo>();// 新建一个 列表数组 }else if ("msg".equals(xParser.getName())) {
msgInfo = new MsgInfo(); // 新建一个需要重复取出的列表
String mId = xParser.getAttributeValue(0);// 获得标签的属性值 ,只有一个属性 :0
msgInfo.setId(Integer.parseInt(mId)); //将属性添加到列表的ID中 }else if ("body".equals(xParser.getName())) {
String mBodyStr = xParser.nextText(); //直接添加到列表中
msgInfo.setBody(mBodyStr); //将子标签的值添加到列表的body中 }else if ("address".equals(xParser.getName())) {
String maddressStr = xParser.nextText(); //直接添加到列表中
msgInfo.setAddress(maddressStr); //将子标签的值添加到列表的address中 }else if ("type".equals(xParser.getName())) {
String mtypeStr = xParser.nextText(); //直接添加到列表中
msgInfo.setType(Integer.parseInt(mtypeStr)); //将子标签的值添加到列表的type中 }else if ("date".equals(xParser.getName())) {
String mdateStr = xParser.nextText(); //直接添加到列表中
msgInfo.setDate(mdateStr); //将子标签的值添加到列表的date中 }
break;
case XmlPullParser.END_TAG:
if ("msg".equals(xParser.getName())) {
// it is end_tag that end a list ,that over a msg list
msgInfos.add(msgInfo); // add a list goto the lists
msgInfo = null; // 制空list
}
break; default:
break;
}
type = xParser.next(); }
return msgInfos; //get the lists back to return }
}

MsgInfo.java

model层,封装构造方法和属性函数,不过值得注意的是,这里对比前面一篇的XML序列化 有 少许改动,特别是date 字段的类型的改变

 package com.test.MsgInfo;

 /**
* @author daomul
* 短信信息
*/ public class MsgInfo { private String date;
private int type;
private String body;
private String address;
private int id; //无参构造方法
public MsgInfo() { } //有参构造方法 Generate Constructor use fields...
public MsgInfo(String date, int type, String body, String address,int id) {
super();
this.date = date;
this.type = type;
this.body = body;
this.address = address;
this.id = id;
} @Override
public String toString() {
return "[日期=" + date + ", 类型=" + type + ", 正文=" + body
+ ", 来源=" + address + ", 信息id=" + id + "]";
} //setter and getter
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }

XML 文件打开的预览图:

结果界面显示:

Andorid- 反序列化,采用pull解析 xml 文件的更多相关文章

  1. [android] 采用pull解析xml文件

    /***********2016年5月6日 更新**********************/ 知乎:Android 中有哪几种解析 xml 的类,官方推荐哪种 ? 以及它们的原理和区别? 刘吉财: ...

  2. 使用XML序列化器生成XML文件和利用pull解析XML文件

    首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...

  3. pull解析xml文件

    pull解析xml文件 先自己写一个xml文件,存一些天气信息 拿到xml文件 InputStream is = getClassLoader().getResourceAsStream(" ...

  4. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...

  5. pull 解析XML 文件

    pull解析的特点 事件驱动机制来解析 当解析到一个节点,会自动停止,不会往下继续解析,好处 :很好能够控制流程 android默认采用pull解析 pull解析的事件类型 start_documen ...

  6. Android pull解析xml文件

    本文介绍android中使用pull来解析xml文件 先自己写一个xml文件,存一些天气信息 <?xml version="1.0" encoding="UTF-8 ...

  7. android——使用pull解析xml文件

    1.persons.xml 将persons.xml文件放到src目录下.其代码如下: <?xml version='1.0' encoding='UTF-8' standalone='yes' ...

  8. Android SAX、DOM、Pull解析xml文件剖析与案例讲解

    XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ...

  9. 使用PULL解析XML文件

    转载博文1:http://blog.csdn.net/wangkuifeng0118/article/details/7313241 XmlPull和Sax类似,是基于流(stream)操作文件,然后 ...

随机推荐

  1. UML总结---UML中的事物和关系

    UML中的事物 名称 说明 图形 类 相同属性方法的集合 接口 类或组件提供的,可以完成特定功能的一组操作的集合 协作 合作的动作 用例 系统的一个功能 节点 代表可计算的资源 活动类 有多个线程的类 ...

  2. HttpComponents 基础接口/类与HTTP message的对应关系

    前提一: 什么是HTTP Message -- 遵循HTTP协议发送的消息!其格式是固定的:HTTP Message = Message Line + Message Header + Message ...

  3. IOS内购支付server验证模式

    IOS 内购支付两种模式: 内置模式 server模式 内置模式的流程: app从app store 获取产品信息 用户选择须要购买的产品 app发送支付请求到app store app store ...

  4. Swift数值运算

    Swift 让全部数值类型都支持了主要的四则运算: 加法(+) 减法(-) 乘法(*) 除法(/) 1 + 2 // 等于 3 5 - 3 // 等于 2 2 * 3 // 等于 6 10.0 / 2 ...

  5. thinkphp模板中无法给自定义函数传多个参数

    1.模板的用法 {:function(param1,param2,param3...)} 2.实例 <td>{:getChannelInfo($adminId,$v['sale_id']) ...

  6. jQuery-理解事件

    一.理解事件 1.什么是事件 事件是Web浏览器通知应用程序(比如我们的js)发生了某个事情! 我们可以为这些特定的事情,事先安排好处理方案,这样就能够实现互动! 2.事件目标 你可以简单的理解为事件 ...

  7. Unity获取指定资源目录下的所有文件

    使用前需要引入System.IO;这个命名空间 public void GetFiles() { //路径 //string path = string.Format("{0}", ...

  8. TODO的用法

    visual studio提供//TODO标记,不过不会在右边标记处明显标识,需要你选择菜单栏的视图进行查看.方法如下: 1.首先在你还未完成的地方打上TODO标记,以下方式均可: 1)//TODO: ...

  9. VC++ 实现窗口抖动

    RECT rect; int x, y, nWidth, nHeight; GetWindowRect(&rect); x = rect.left; y = rect.top; nWidth ...

  10. zookeeper命令行

    ZooKeeper -server host:port cmd args stat path [watch] set path data [version] ls path [watch] delqu ...