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. Hash表的表大小

    hash表的出现主要是为了对内存中数据的快速.随机的访问.它主要有三个关键点:Hash表的大小.Hash函数.冲突的解决. 这里首先谈谈第一点:Hash表的大小. Hash表的大小一般是定长的,如果太 ...

  2. 【转】【C++】__stdcall、__cdcel和__fastcall三者的区别

    __stdcall.__cdecl和__fastcall是三种函数调用协议,函数调用协议会影响函数参数的入栈方式.栈内数据的清除方式.编译器函数名的修饰规则等.如下图所示,可以在IDE环境中设定所有函 ...

  3. vue2.0动态添加组件

    方法一.<template> <input type="text" v-model='componentName'> <button @click=' ...

  4. C++ 程序可以定义为对象的集合

    C++ 基本语法C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互.现在让我们简要地看一下什么是类.对象,方法.即时变量. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜色 ...

  5. ffplay的音视频同步分析

    以前工作中参与了一些音视频程序的开发,不过使用的都是芯片公司的SDK,没有研究到更深入一层,比如说音视频同步是怎么回事.只好自己抽点时间出来分析开源代码了,做音视频编解码的人都知道ffmpeg,他在各 ...

  6. VMWare -- 工作模式

    VMWare提供三种工作模式桥接(bridge).NAT(网络地址转换)和host-only(主机模式). 桥接模式 在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和 ...

  7. Storm On YARN带来的优点

    1)弹性计算资源     将storm执行在yarn上后,Storm能够与其它计算框架(如mapreduce)共享整个集群的资源.这样当Storm负载骤增时,可动态为它添加计算资源. 负载减小时,能够 ...

  8. 【Java面试题】16 静态代码块,main方法,构造代码块,构造方法

    public class HelloB extends HelloA{ public HelloB() { System.out.println("HelloB"); } { Sy ...

  9. Spring-Resource接口

    4.1.1 概述 在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源.File资源资源.ClassPath相关资源.服务器相关资源(JBoss AS 5.x上的VFS资源)等等很 ...

  10. js 自函数

    函数基本概念: 函数声明:function box(){} 函数表达式:var box = function(){}; 匿名函数:function(){} 属于函数表达式 匿名函数的作用:如果将匿名函 ...