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)操作文件,然后 ...
随机推荐
- zend opcache的最佳设置
2016-01-21 在网上无意中看到的一篇文章,这哥们非常简洁地谈论了zend opcache的最佳设置,他说他为此花了大量的时间探索zend opcache的每个设置选项的细节,甚至是阅读它的源代 ...
- jQuery源码分析-jQuery中的循环技巧
作者:nuysoft/JS攻城师/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 前记:本文收集了jQuery ...
- 重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)
背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...
- D方法 自动完成
控制器 public function insert(){ $Wztj = D("Wztj");if($vo=$Wztj->create()){ if($Wztj->a ...
- C++多线程环境下注意共享资源的释放顺序
比如我现在写一个多线程下载程序,包含DownloadTask.HttpDownload两个类. class DownloadTask { //省略n行代码 public: int m_threads; ...
- docker和kubernetes docker的区别
之前公司的测试环境,刚开始自己搭建虚拟机,然后安装redis,nginx,mq,mysql,tomcat,jdk,marven,还有jekins.前面些还算好点,jekins还是比较麻烦的.然后搭完以 ...
- Loadrunner中socket协议中的三个关联函数
这3个函数其实都可以动态获取运行中收到的数据包中的数据,只要跟在要获取的收取数据包脚本后面即可.其中:lrs_save_searched_string和lrs_save_param如果buf_desc ...
- Unity5.5+easytouch5双摇杆控制角色移动
第一步:新建两个Joystick,分别改名LeftJoyStick和RightJoyStick 在LeftJoyStick的ETC Joystick-Axes properties中的Horizont ...
- phpcms二级栏目的调用
1.二级栏目的调用方法 {php $data = subcat($module, $catid);} {loop $data $n $r} {if $r[ismenu]} {$r[catname]} ...
- JAVA程序员应该看的15本书的电子版
转载▼ 转载自:http://blog.sina.com.cn/s/blog_8297f0d00100v5ew.html 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多, ...