XML 序列化与PULL解析
简介
Pull解析XML XmlPullParser解析器的运行方式与SAX解析器相似。它提供了类似的事件(开始元素和结束元素),但需要使用parser.next()方法来提取它们。事件将作为数值代码被发送,因此可以根据不同的事件代码值来进行不同的处理。通过parser.getEventType()方法来取得事件的代码值。 当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取【属性】的值,也可调用它的nextText()获取本【节点】的值。具体思路: 1、构建PullXmlParser解析器 XmlPullParser parser = Xml.newPullParser();或XmlPullParserFactory fac = XmlPullParserFactory.newInstance();//获取解析器工厂XmlPullParser parser = fac.newPullParser();//通过解析器工厂获取解析器2、将xml文档注册到解析器中 parser.setInput(is, "utf-8");3、触发事件,获得事件类型码 int type = parser.getEventType();4、针对事件进行具体分析 "name".equals(parser.getName());//判断开始标签元素是否是name parser.getAttributeValue(0);//得到标签的【属性值 】 parser.nextText();//获取下一个Text【节点的值 】5、触发并进入下一个事件 type = parser.next();Pull解析和Sax解析不一样的地方有:优点:不是一次加载,中途可以停止
- pull读取xml文件后触发相应的事件调用方法返回的是数字
- pull可以在程序中控制想解析到哪里就可以停止解析。
Activity
public class MainActivity extends ListActivity {private TextView tv_info;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);tv_info = new TextView(this);// 将内容显示在TextView中tv_info.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);getListView().addFooterView(tv_info);String[] array = { "生成xml文件(序列化)", "生成XML的内容", "解析XML文件", };setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {switch (position) {case 0:try {ArrayList<SmsInfo> infos = new ArrayList<SmsInfo>();Random random = new Random();for (int i = 0; i < 10; i++) {infos.add(new SmsInfo(random.nextInt(100), "短信" + random.nextBoolean(), "电话:" + i));}SmsInfoXmlUtils.xmlSerializer(infos, Environment.getExternalStorageDirectory() + "/sms.xml");} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}break;case 1:try {BufferedReader bufr = new BufferedReader(new FileReader(new File(Environment.getExternalStorageDirectory() + "/sms.xml")));StringBuffer content = new StringBuffer();String line = null;//另外开辟一个缓冲区,存储读取的一行数据,返回包含该行内容的字符串,不包含换行符,如果已到达流末尾,则返回【 null】while ((line = bufr.readLine()) != null) {content.append(line);}bufr.close();tv_info.setText(content.toString());} catch (IOException e1) {e1.printStackTrace();}break;case 2:try {ArrayList<SmsInfo> infos = SmsInfoXmlUtils.xmlParser(new FileInputStream(new File(Environment.getExternalStorageDirectory() + "/sms.xml")));StringBuffer sb = new StringBuffer();for (SmsInfo info : infos) {sb.append(info + "\n");}tv_info.setText(sb.toString());} catch (FileNotFoundException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}break;}}}
工具类
public class SmsInfoXmlUtils {/**将传入的数据以XML形式保存到制定的路径上*/public static void xmlSerializer(ArrayList<SmsInfo> infos, String path) throws IllegalArgumentException, IllegalStateException, IOException {XmlSerializer xmlSerializer = Xml.newSerializer();FileOutputStream fos = new FileOutputStream(new File(path));xmlSerializer.setOutput(fos, "utf-8");xmlSerializer.startDocument("utf-8", true);// 写入头,指定头部encoding、standalone属性的值xmlSerializer.startTag(null, "smss");// 写开始标签,定义namespace和标签名for (SmsInfo info : infos) {xmlSerializer.startTag(null, "sms");xmlSerializer.attribute(null, "id", info.id + "");// 写入【属性】名称及属性值xmlSerializer.startTag(null, "address");// 写入【节点】名称xmlSerializer.text(info.address);// 写入节点的值xmlSerializer.endTag(null, "address");xmlSerializer.startTag(null, "body");xmlSerializer.text(info.body);xmlSerializer.endTag(null, "body");xmlSerializer.endTag(null, "sms");}xmlSerializer.endTag(null, "smss");xmlSerializer.endDocument();fos.close();}/**参数为一个输入流,返回值为解析此输入流后生成的集合*/public static ArrayList<SmsInfo> xmlParser(InputStream is) throws Exception {ArrayList<SmsInfo> infos = null;SmsInfo info = null;XmlPullParserFactory fac = XmlPullParserFactory.newInstance();//获取解析器工厂XmlPullParser parser = fac.newPullParser();//通过解析器工厂获取解析器parser.setInput(is, "utf-8");//初始化,指定要解析的文件(输入流)及文件的编码方式int type = parser.getEventType();//获取当前事件的事件类型,类型值在XmlPullParser中均已定义while (type != XmlPullParser.END_DOCUMENT) {//一直解析文档,直到解析到文档的结束事件switch (type) {//根据事件的类型执行指定的事件case XmlPullParser.START_TAG://标签开始if ("smss".equals(parser.getName())) {//解析到全局开始标签infos = new ArrayList<SmsInfo>();} else if ("sms".equals(parser.getName())) {//解析到sms标签info = new SmsInfo();//创建一个自定义对象,保存信息info.id = Integer.valueOf(parser.getAttributeValue(0));//得到标签的属性值,注意id是属性值,而下面的body是节点的值} else if ("body".equals(parser.getName())) {//解析到body节点info.body = parser.nextText();//nextText()为让解析器指向name节点,并得到name节点的值} else if ("address".equals(parser.getName())) {info.address = parser.nextText();}break;case XmlPullParser.END_TAG://标签结束if ("sms".equals(parser.getName())) {//解析到sms闭合标签infos.add(info);//将这个城市的天气信息存到集合中info = null;//清空,节约内存}break;}type = parser.next();//这一步很重要,该方法返回一个事件码,也是触发下一个事件的方法}return infos;//整个文档解析完毕,返回集合}}
附件列表
XML 序列化与PULL解析的更多相关文章
- Android -- 创建XML文件对象及其序列化, pull解析XML文件
1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...
- Android 下用 Pull 解析和生成 XML
Java 中是可以用 SAX 和 DOM 解析 XML 的,虽然在 Android 下也可以用这2中方式,但是还是推荐用 Pull.Pull 使用简单,效率相对高,Android 下是集成了 Pul ...
- Android中XML解析-PULL解析
前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 ...
- Android程序解析XML文件的方法及使用PULL解析XML案例
一.一般解析XML文件的方法有SAX和DOM.PULL (1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信 ...
- Android之Pull解析XML
一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...
- Android pull解析xml文件
本文介绍android中使用pull来解析xml文件 先自己写一个xml文件,存一些天气信息 <?xml version="1.0" encoding="UTF-8 ...
- 安卓使用pull解析器解析XML文件
学习一下: public class MainActivity extends Activity { List<City> cityList; @Override protected vo ...
- pull解析xml文件
pull解析xml文件 先自己写一个xml文件,存一些天气信息 拿到xml文件 InputStream is = getClassLoader().getResourceAsStream(" ...
- 用PULL解析器解析XML文件
第一种方式(简洁,直接用pullparser.nextText()来返回下一个String类型的值): 1 package lee.service; 2 3 import java.io.InputS ...
随机推荐
- java高精度数组
POJ1205 递推公式为a[i] = 3*a[i-1] - a[i-2], a[1] = 1,a[2] = 3 , i 最高为100; 搞懂了使用BigInteger开数组. import java ...
- 支付宝集成获取私钥与公钥-b
项目需要,需要在客户端集成支付宝接口.就研究了一下:因为使用支付宝接口,就需要到支付宝官网:注册帐号,并申请.下面讲的是申请好之后的操作.登录成功之后, 店家我的商家服务—在页面的下方找到——&g ...
- ExtJS 4 Grids 详解
Grid Panel是ExtJS最常用的组件之一,它的功能非常丰富,提供了非常便捷的方法执行排序,分组,编辑数据. Basic Grid Panel 基本表格面板 让我们创建一个简单的表格,这有创建和 ...
- Unity3D RPC调用顺序问题
使用Unity自带的Network实现多人协同任务时,因为使用RPC传递消息.RPC即远程过程调用,对于它的使用,第一反应的问题就是如果连续两次调用RPC,RPC的函数会顺序执行吗?还是只要RPC的消 ...
- 自动垂直居中的js
var _htmlheight; function start(){ _htmlheight=document.body.scrollHeight; resize(); /*$("#copy ...
- Microsoft Office 2013 激活方法
Microsoft Office 2013 激活方法 Microsoft Office 2013是微软的新一代Office办公软件,全面采用Metro界面,包括Word.PowerPoint.Ex ...
- (转载)遍历memcache中已缓存的key
(转载)http://www.cnblogs.com/ainiaa/archive/2011/03/11/1981108.html 最近需要做一个缓存管理的功能.其中有一个需要模糊匹配memcache ...
- 固定IP和绑定了MAC,可以在设置无线路由器供笔记本电脑和平板上网吗?
固定IP和绑定了MAC,可以在设置无线路由器供笔记本电脑和平板上网吗? 这跟我们单位一样.很简单:首先要占一个 IP/MAC ,能上外网的,这首先要有,谁要肯给地址,我们这儿领导才有呢.我是网管,当然 ...
- entityframework分布式事务中遇到的 “与基础事务管理器的通信失败”的解决方法
首先是ef的多数据库操作实现事务的方法 public int AddDifferenceDB(userinfo1 user1, userinfo user) { ; using (var test2D ...
- 关于TCP的粘包和拆包
问题产生 一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题. 下面可以看一张图,是客户端向服务端发送包: 1. 第一种情况 ...