Andorid- 反序列化,采用pull解析 xml 文件
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 文件的更多相关文章
- [android] 采用pull解析xml文件
/***********2016年5月6日 更新**********************/ 知乎:Android 中有哪几种解析 xml 的类,官方推荐哪种 ? 以及它们的原理和区别? 刘吉财: ...
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
- pull解析xml文件
pull解析xml文件 先自己写一个xml文件,存一些天气信息 拿到xml文件 InputStream is = getClassLoader().getResourceAsStream(" ...
- Android -- 创建XML文件对象及其序列化, pull解析XML文件
1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...
- pull 解析XML 文件
pull解析的特点 事件驱动机制来解析 当解析到一个节点,会自动停止,不会往下继续解析,好处 :很好能够控制流程 android默认采用pull解析 pull解析的事件类型 start_documen ...
- Android pull解析xml文件
本文介绍android中使用pull来解析xml文件 先自己写一个xml文件,存一些天气信息 <?xml version="1.0" encoding="UTF-8 ...
- android——使用pull解析xml文件
1.persons.xml 将persons.xml文件放到src目录下.其代码如下: <?xml version='1.0' encoding='UTF-8' standalone='yes' ...
- Android SAX、DOM、Pull解析xml文件剖析与案例讲解
XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ...
- 使用PULL解析XML文件
转载博文1:http://blog.csdn.net/wangkuifeng0118/article/details/7313241 XmlPull和Sax类似,是基于流(stream)操作文件,然后 ...
随机推荐
- 事件总线demo
经过几天的努力拜读大牛高手文章,终于对事件总线有所了解,特此记录下来,以免忘记 1.定义相关的接口: A 事件接口 public interface IDomainEvent { DateTime ...
- thinkphp 使用原生mysql语句 联合查询
<?php class DelAction extends Action { public function ml(){ // 实例化一个空模型,没有对应任何数据表 $Dao = M(); // ...
- GDB十分钟教程 (链接)
未联系作者,只能放个链接了. 十分赞的gdb教程. GDB十分钟教程
- DB2多行转一行【XML方式】
分组然后合并,然后去除XML标签 SELECT replace(replace(replace(xml2clob(xmlagg(xmlelement(name A, [字段]))),'</A&g ...
- par函数usr参数-控制坐标系的范围
在R语言中,会根据数据的范围自动计算x轴和y轴的范围,举个例子 比如绘制一个1到5的散点图:代码示例: plot(1:5, 1:5) 生成的图片如下: 从图片中我们可以看到,x轴的起始位置比1要小,终 ...
- MySQL 数据库常用命令小结
MySQL 数据库常用命令 1.MySQL常用命令 create database name; 创建数据库 use databasename; 选择数据库 drop database name 直接删 ...
- 【Java NIO深入研究3】文件锁
1.1概述——文件锁 文件锁定初看起来可能让人迷惑.它 似乎 指的是防止程序或者用户访问特定文件.事实上,文件锁就像常规的 Java 对象锁 — 它们是 劝告式的(advisory) 锁.它们不阻止任 ...
- url传参错误的痛
今天用一下方法给后台传参数: var url = 'patrolpoint!totalHistoryPage.action' + '?patrolPoint.batchOnTime=' ...
- 数字转人民币大写(SQL SERVER)
--数字转人民币大写NumToRMB ---新建方法create FUNCTION dbo.NumToRMB (@num numeric(14,5)) RETURNS varchar(100) ...
- html5 经验记录 持续更新
1 关于page cache 由于移动端浏览器webkit基本都实现了page cache(火狐叫做back-forwoad cache);所以回退操作基本不会触发onload操作了,不过上一页的状态 ...