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. 关于Cocos2d-x的瓦片地图

    1.cocos2d-x的瓦片地图是用Tiled地图编辑器做的,这个软件开源,免费,一般都是用它制作瓦片地图. 2.瓦片地图是由块层和对象组成的,块层的作用是显示和一些重叠的时候覆盖角色的作用,而对象是 ...

  2. 常用CSS缩写语法总结(转)

    使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.css缩写的主要规则如下: 颜色 16进制的色彩值,如果每两位的值相同,可以缩写一半,例如:#000000可以缩写为#000;#336699可以缩 ...

  3. KEGG orthology (KO) 数据库简介

    KEGG, 简称京都基因组百科全书,包含了许多的数据库,对于研究基因功能来说,KEGG orthology 数据库是最基本的一个数据库: KEGG Orthology 简称KO, 对于每个功能已知的基 ...

  4. 一个窗口里包含一个iframe,点击iframe内的submit按钮,返回的视图总是显示在iframe中,我想要的效果是点击按钮后返回的视图是在浏览器窗口中...?asp.net mvc 的action中,不用js怎么实现??????????

    Content("<script type='text/javascript'>parent.location.href = '" + url + "';&l ...

  5. 【Java面试题】14 super.getClass()方法调用

    下面程序的输出结果是多少? import java.util.Date; public class Test extends Date{ public static void main(String[ ...

  6. C#委托和事件定义和使用

    委托 定义委托的语法和定义方法比较相似,只是比方法多了一个关键字delegate ,我们都知道方法就是将类型参数化,所谓的类型参数化就是说该方法接受一个参数,而该参数是某种类型的参数,比如int.st ...

  7. Redis生成Id主键的工具

    public class PrimaryKeyGenerator { private static readonly NedisClient client = new NedisClient(GetR ...

  8. 使用Git Hooks实现开发部署任务自动化

    前言 版本控制,这是现代软件开发的核心需求之一.有了它,软件项目可以安全的跟踪代码变更并执行回溯.完整性检查.协同开发等多种操作.在各种版本控制软件中,git是近年来最流行的软件之一,它的去中心化架构 ...

  9. python使用sqlalchemy连接pymysql数据库

    python使用sqlalchemy连接mysql数据库 字数833 阅读461 评论0 喜欢1 sqlalchemy是python当中比较出名的orm程序. 什么是orm? orm英文全称objec ...

  10. HTTP 请求过程

    如下,我们在浏览器输入一个域名,按回车之后,便向该域名对应的服务器发送了一个请求:服务器接收到这个请求后进行处理和解析,然后返回响应的内容给浏览器,浏览器再对其进行解析然后呈现网页 我们可以通过 Ch ...