文档章节

Android使用pull解析器解析xml文件

指尖残雪
 指尖残雪
发布于 2016/05/22 23:57
字数 1669
阅读 16
收藏 0
点赞 2
评论 0

转载出处:http://blog.csdn.net/lyh7736362/article/details/6230847

以下面这个xml文件为例

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="23">  
  4.         <name>李明</name>  
  5.         <age>30</age>  
  6.     </person>  
  7.     <person id="20">  
  8.         <name>李向梅</name>  
  9.         <age>25</age>  
  10.     </person>  
  11. </persons>  
 

 

里面的所有东西都可以统称为节点<person>  李明  30  都为节点

而更准确的说 <person> <name> <age>为element,即为元素

而 李明 30 为text,即为文本节点

而 id 为属性,"23"为属性值

第2行与第3行之间的空格也是一个节点




新建一个person类在lyh.domain 根据xml文件设置相对应的变量和方法

[java]  view plain copy
  1. package lyh.domain;  
  2. public class Person {  
  3.     private int id;  
  4.     private String name;  
  5.     private short age;  
  6.       
  7.     public Person() {  
  8.     }  
  9.       
  10.       
  11.     public Person(int id, String name, short age) {  
  12.         this.id = id;  
  13.         this.name = name;  
  14.         this.age = age;  
  15.     }  
  16.     public Person(String name, short age) {  
  17.         this.name = name;  
  18.         this.age = age;  
  19.     }  
  20.     public int getId() {  
  21.         return id;  
  22.     }  
  23.     public void setId(int id) {  
  24.         this.id = id;  
  25.     }  
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.     public void setName(String name) {  
  30.         this.name = name;  
  31.     }  
  32.     public short getAge() {  
  33.         return age;  
  34.     }  
  35.     public void setAge(short age) {  
  36.         this.age = age;  
  37.     }  
  38.     @Override  
  39.     public String toString() {  
  40.         // TODO Auto-generated method stub  
  41.         return "id="+id+",name="+ name + ",age="+ age;  
  42.     }  
  43.       
  44. }  
 

 

 

 

编写业务bean

  1. package lyh.service;  
  2. import java.io.InputStream;  
  3. import java.io.Writer;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import lyh.domain.Person;  
  7. import org.xmlpull.v1.XmlPullParser;  
  8. import org.xmlpull.v1.XmlSerializer;  
  9. import android.util.Xml;  
  10. public class PullPersonService {  
  11.       
  12.     public static void writeXml(List<Person> persons , Writer writer) throws Exception{  
  13.           
  14.         //1.使用android的XML工具类去创建一个序列化对象  
  15.         XmlSerializer serializer =  Xml.newSerializer();  
  16.           
  17.         //2.设置xml文件输出的位置  
  18.         serializer.setOutput(writer);  
  19.           
  20.         //3.设置xml字符编码和standalone属性  
  21.         serializer.startDocument("UTF-8"true);  
  22.           
  23.         //4.设置开始标签的命名空间前缀和标签的名称,startTag与endTag应成对出现  
  24.         serializer.startTag(null"persons");  
  25.           
  26.         //5.通过迭代从list中取出每个person以便写出  
  27.         for(Person person : persons){  
  28.               
  29.             serializer.startTag(null"person");  
  30.               
  31.             //6.设置id的值  
  32.             serializer.attribute(null"id", String.valueOf(person.getId()));  
  33.               
  34.             //7.设置name的文本  
  35.             serializer.startTag(null"name");  
  36.             serializer.text(person.getName());  
  37.             serializer.endTag(null"name");  
  38.               
  39.             //8.设置age的文本  
  40.             serializer.startTag(null"age");  
  41.             serializer.text(String.valueOf(person.getAge()));  
  42.             serializer.endTag(null"age");  
  43.               
  44.             serializer.endTag(null"person");  
  45.         }  
  46.           
  47.         //9.设置结束标签的命名空间前缀和标签的名称  
  48.         serializer.endTag(null"persons");  
  49.           
  50.         //10.设置结束文档  
  51.         serializer.endDocument();  
  52.           
  53.         //11.writer为缓冲输出类,需要刷出到文件,然后关闭  
  54.         writer.flush();  
  55.         writer.close();  
  56.     }  
  57.       
  58.       
  59.     public static List<Person> readXml(InputStream inStream) throws Exception{  
  60.           
  61.         List<Person> persons = null;  
  62.         Person person = null;  
  63.           
  64.         //1.使用android提供的Xml类new一个XmlPullerParser,即new一个XmlPull解析器  
  65.         XmlPullParser parser = Xml.newPullParser();  
  66.           
  67.         //2.然后设置需要解析的xml文件,第一个参数为输入流,第二个参数为字符编码  
  68.         parser.setInput(inStream, "UTF-8");  
  69.           
  70.         //3.触发事件,当这个方法遇到某个字符符合XML语法,就会触发这个语法所代表的数字  
  71.         int eventCode = parser.getEventType();  
  72.           
  73.         //4.XML文件的第一行为开始文档事件START_DOCUMENT,最后一行为结束文档事件END_DOCUMENT,我们需要不断读取xml文件的内容  
  74.         while( XmlPullParser.END_DOCUMENT != eventCode ){  
  75.               
  76.             //5.我们对这个事件进行处理,我们感兴趣的是<person>这个元素  
  77.             switch(eventCode){  
  78.               
  79.             case XmlPullParser.START_DOCUMENT://开始文档事件  
  80.                 persons = new ArrayList<Person>();//初始化用来存放person的List  
  81.                 break;  
  82.               
  83.               
  84.             case XmlPullParser.START_TAG://6.如果这个事件是开始元素(例如<persons>)事件  
  85.                   
  86.                 if("person".equals(parser.getName())){  
  87.                     person = new Person();  
  88.                       
  89.                     //7.使用解析器得到当前元素的属性,即id  
  90.                     person.setId(new Integer(parser.getAttributeValue(0)));  
  91.                       
  92.                 }else if(person!=null){  
  93.                     if("name".equals(parser.getName())){  
  94.                         //8.如果当前元素为开始标签,下一个元素为文本,就会返回这个文本  
  95.                         person.setName(parser.nextText());  
  96.                           
  97.                     }else if("age".equals(parser.getName())){  
  98.                         //8.如果当前元素为开始标签,下一个元素为文本,就会返回这个文本  
  99.                         person.setAge(new Short(parser.nextText()));  
  100.                     }  
  101.                 }  
  102.                 break;  
  103.                   
  104.             case XmlPullParser.END_TAG://9.如果这个事件是结束元素(例如</persons>)事件  
  105.                   
  106.                 if("person".equals(parser.getName()) && person != null){  
  107.                     //往List里添加person,并把person置空,以便下次的读取  
  108.                     persons.add(person);  
  109.                     person = null;  
  110.                 }  
  111.                   
  112.                 break;  
  113.             }  
  114.             //10.当我们第一次调用getEventType()方法,得到的是XML文件的第一行,即<?xml version="1.0" encoding="UTF-8"?>,所以需要再往下一行读取  
  115.             //接着就遇到了<persons>,触发一个事件,再往下就是空格,触发一个事件,如此类推  
  116.             eventCode = parser.next();  
  117.         }  
  118.           
  119.         //11.返回储存好的list  
  120.         return persons;  
  121.     }  
  122. }  

 

编写单元测试类,需要测试时,请把itcase.xml放入到src文件夹中

[java]  view plain copy
  1. package lyh.xml;  
  2. import java.io.InputStream;  
  3. import java.util.List;  
  4. import lyh.domain.Person;  
  5. import lyh.service.PullPersonService;  
  6. import android.test.AndroidTestCase;  
  7. import android.util.Log;  
  8. public class XmlPersonServiceTest extends AndroidTestCase{  
  9.       
  10.     private static final String TAG = "PullPersonServiceTest";  
  11.       
  12.     //使用pull解析xml内容  
  13.     public void testPullReadXml() throws Exception{  
  14.         InputStream inStream = XmlPersonServiceTest.class.getClassLoader().getResourceAsStream("itcase.xml");  
  15.         List<Person> persons = PullPersonService.readXml(inStream);  
  16.         for(Person person : persons){  
  17.             Log.i(TAG, person.toString());  
  18.         }  
  19.         inStream.close();  
  20.     }  
  21. }  
 

 

 

配置AndroidManifest.xml文件,为其配置单元测试环境


在<application android:icon="@drawable/icon" android:label="@string/app_name">

下面加入

<uses-library android:name="android.test.runner"/>

在 <uses-sdk android:minSdkVersion="10" />下面加入

    <instrumentation android:name="android.test.InstrumentationTestRunner"

android:targetPackage="lyh.xml" android:label="Tests for My App"/>

注意android:targetPackage="lyh.xml" 要与原配置文件中的package的一致

 




 

在通过了单元测试以后就可以在XmlActivity中编写了

将TextView的id设置为result,将xml文件内容输出到手机屏幕上

 

[java]  view plain copy
  1. package lyh.xml;  
  2. import java.io.InputStream;  
  3. import java.util.List;  
  4. import lyh.domain.Person;  
  5. import lyh.service.PullPersonService;  
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.widget.TextView;  
  10. import android.widget.Toast;  
  11. public class XmlActivity extends Activity {  
  12.     private static final String TAG = "XmlActivity";  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.           
  18.         TextView resultView = (TextView)this.findViewById(R.id.result);  
  19.         InputStream inStream = XmlActivity.class.getClassLoader().getResourceAsStream("itcase.xml");  
  20.         try {  
  21.             List<Person> persons = PullPersonService.readXml(inStream);  
  22.             StringBuilder sb = new StringBuilder();  
  23.             for( Person person : persons){  
  24.                 sb.append(person.toString()).append("/n");  
  25.             }  
  26.             resultView.setText(sb.toString());  
  27.         } catch (Exception e) {  
  28.             Log.e(TAG, e.toString());  
  29.             Toast.makeText(this"解析失败", Toast.LENGTH_LONG).show();  
  30.         }  
  31.     }  
  32. }  
 


 

 

 

使用pull输出xml文件

在PullPersonService编写一个writeXml方法

[java]  view plain copy
  1. public static void writeXml(List<Person> persons , Writer writer) throws Exception{  
  2.           
  3.         //1.使用android的XML工具类去创建一个序列化对象  
  4.         XmlSerializer serializer =  Xml.newSerializer();  
  5.           
  6.         //2.设置xml文件输出的位置  
  7.         serializer.setOutput(writer);  
  8.           
  9.         //3.设置xml字符编码和standalone属性  
  10.         serializer.startDocument("UTF-8"true);  
  11.           
  12.         //4.设置开始标签的命名空间前缀和标签的名称,startTag与endTag应成对出现  
  13.         serializer.startTag(null"persons");  
  14.           
  15.         //5.通过迭代从list中取出每个person以便写出  
  16.         for(Person person : persons){  
  17.               
  18.             serializer.startTag(null"person");  
  19.               
  20.             //6.设置id的值  
  21.             serializer.attribute(null"id", String.valueOf(person.getId()));  
  22.               
  23.             //7.设置name的文本  
  24.             serializer.startTag(null"name");  
  25.             serializer.text(person.getName());  
  26.             serializer.endTag(null"name");  
  27.               
  28.             //8.设置age的文本  
  29.             serializer.startTag(null"age");  
  30.             serializer.text(String.valueOf(person.getAge()));  
  31.             serializer.endTag(null"age");  
  32.               
  33.             serializer.endTag(null"person");  
  34.         }  
  35.           
  36.         //9.设置结束标签的命名空间前缀和标签的名称  
  37.         serializer.endTag(null"persons");  
  38.           
  39.         //10.设置结束文档  
  40.         serializer.endDocument();  
  41.           
  42.         //11.writer为缓冲输出类,需要刷出到文件,然后关闭  
  43.         writer.flush();  
  44.         writer.close();  
  45.     }  
 

 

 

 

在XmlPersonServiceTest中写一个单元测试,当然也可以在activity中写,不过最好先进行单元测试

[java]  view plain copy
  1. //使用pull写入xml内容  
  2.     public void testPullWriteXml() throws Exception{  
  3.         //1.设置输出流,输出到persons.xml且这个文件的权限为可读的  
  4.         FileOutputStream outStream = this.getContext().openFileOutput("persons.xml",Context.MODE_WORLD_READABLE);  
  5.         OutputStreamWriter writer = new OutputStreamWriter(outStream,"UTF-8");  
  6.         List<Person> persons = new ArrayList<Person>();  
  7.         persons.add(new Person(11,"老毛",(short)20));  
  8.         persons.add(new Person(12,"撒旦",(short)30));  
  9.         persons.add(new Person(13,"飞飞",(short)31));  
  10.         PullPersonService.writeXml(persons,writer);  
  11.         outStream.flush();  
  12.         outStream.close();  
  13.     }  
 

 

 

 

 

 

进行单元测试以后就可以使用文件浏览器到data.lyh.xml.files文件夹下查看到persons.xml文件了,可以使用右上方的 Pull a file from the device按钮把文件提取到电脑上查看

本文转载自:http://blog.csdn.net/bq1073100909/article/details/37706425

共有 人打赏支持
指尖残雪
粉丝 7
博文 73
码字总数 0
作品 0
上海
后端工程师
说说在 Android 中如何解析 XML

网络上传输数据有两种格式:XML 与 JSON。JSON 暂且按下不表,我们先说说如何解析 XML。 1 搭建 Web 服务器 假设我们使用 Apache HTTP Server 搭建好了 Web 服务器(搭建过程请看 这里)。 ...

deniro ⋅ 06/10 ⋅ 0

XML解析:PULL解析

概述: PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解...

Xushao ⋅ 2012/09/13 ⋅ 2

android数据存储与访问之使用pull解析器

Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。andro...

长平狐 ⋅ 2012/09/03 ⋅ 0

Android:手把手教你学会使用Google出品的序列化神器Protocol Buffer

前言 习惯用 数据存储格式的你们,相信大多都没听过 其实 是 出品的一种轻量 & 高效的结构化数据存储格式,性能比 真的强!太!多! 由于 出品,我相信已经具备足够的吸引力 今天,我将详细介...

Carson_Ho ⋅ 04/16 ⋅ 0

在 Android 3.0 平台上创建和解析 XML

简介: Android 是最常用的智能手机平台,它在移动平板电脑上也能发挥作用。XML 是数据交换的标准媒介。您可以对标准 XML 解析、标准 XML 转换和 Android 使用相同的生成器、解析器和转换器 ...

IBMdW ⋅ 2011/11/14 ⋅ 0

Android 创建与解析XML(六)—— 比较与使用

前面介绍了四种创建、解析XML的方式: 0、 Android 创建与解析XML(一)—— 概述 1、 Android 创建与解析XML(二)—— Dom方式 2、 Android 创建与解析XML(三)—— Sax方式 3、 Android ...

长平狐 ⋅ 2013/01/06 ⋅ 0

Android的三种解析方式

第一种方式:DOM解析器: DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和...

津乐 ⋅ 01/11 ⋅ 0

简析LayoutInflate工作流程

看完郭神的解析后,我打算做一些简单的总结。一开始了解到的东西是LayoutInflate,既然是源码分析,那就得先能查看源码,查看源码的方法是打开你的Android Studio点击File -》Setting -》搜索...

牛板腩天下第一 ⋅ 04/28 ⋅ 0

说说 Android 中如何使用摄像头和相册

很多 APP 应用都有用户头像功能,用户既可以调用摄像头马上拍一张美美的自拍,也可以打开相册选取一张心仪的照片作为头像。 1 调用摄像头 布局文件: 活动类代码: getExternalCacheDir() 可...

deniro ⋅ 05/26 ⋅ 0

Java在android中xml文件解析效率比较分析

在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。 SAX解析器: SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件...

tinydot ⋅ 2016/10/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 44分钟前 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 49分钟前 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 58分钟前 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 59分钟前 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 59分钟前 ⋅ 0

React Native & Weex 区别

JS引擎 Weex使用V8, React native使用JSCore JS开发框架 ( Js Framework ) Weex基于vue.js(2W+ star)。小巧轻量的前端开发框架,组件化,数据绑定,2.0引入virtual dom。 ReactNative使用...

东东笔记 ⋅ 今天 ⋅ 1

UIkit 分页组件动态加载简单实现

1. 问题描述 使用过UIkit分页组件的都清楚,UIkit的分页不能动态刷新数据,也就是不能在点击下一页的时候,动态从后台加载数据,并且刷新页数以及该页数上的数据,下面是一个简单实现,没有做...

影狼 ⋅ 今天 ⋅ 0

Mobx入门之三:Provider && inject

上一节中<App/>组件传递状态temperatures给children -- <TemperatureInput />,如果组建是一个tree, 那么属性的传递则会非常繁琐。redux使用Provider给子组件提供store, connect将子组件和s...

pengqinmm ⋅ 今天 ⋅ 0

魔兽世界 7.0版本 S23/S24/S25全职业普通+精锐套

  死亡骑士   (联盟)   (部落)   (精锐)   恶魔猎手   (联盟)   (部落)   (精锐)   德鲁伊   (联盟)   (部落)   (精锐)   猎人   (联盟) ...

wangchen1999 ⋅ 今天 ⋅ 0

maven顶级pom和子pom的版本号批量修改

当一个版本发布,新起一个版本时,我们只需要手动修改一下项目中pom.xml的版本号就可以了。但是如果这个maven项目有很多的子模块项目,那么一个个手动的去改就显得费时费力又繁琐了。还好,m...

ArlenXu ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部