Android中使用PULL方式解析XML文件

Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:

按以下步骤进行操作:

[1] 新建一个XML文件,命名为student.xml。同时把XML文件放置到assets目录下。student.xml文件的内容如下:

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <students>
  3. <student id="20110806100">
  4. <name>小明</name>
  5. <age>22</age>
  6. <sex>男</sex>
  7. </student>
  8. <student id="20110806101">
  9. <name>小李</name>
  10. <age>24</age>
  11. <sex>男</sex>
  12. </student>
  13. <student id="20110806102">
  14. <name>小丽</name>
  15. <age>21</age>
  16. <sex>女</sex>
  17. </student>
  18. </students>

[2] 根据XML文件中的节点目录,创建一个相对应的实体类,来保存解析的相应信息。在包:com.andyidea.entity下新建Student.java类。

[html] view plaincopy

  1. package com.andyidea.entity;
  2. public class Student {
  3. private String id;
  4. private String name;
  5. private int age;
  6. private String sex;
  7. public String getId() {
  8. return id;
  9. }
  10. public void setId(String id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. public String getSex() {
  26. return sex;
  27. }
  28. public void setSex(String sex) {
  29. this.sex = sex;
  30. }
  31. }

[3] 定义一个使用PULL解析XML文件的工具类:ParserByPULL.java。

[html] view plaincopy

  1. package com.andyidea.util;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import org.xmlpull.v1.XmlPullParser;
  6. import org.xmlpull.v1.XmlPullParserFactory;
  7. import android.util.Xml;
  8. import com.andyidea.entity.Student;
  9. public class ParserByPULL {
  10. //采用XmlPullParser来解析XML文件
  11. public static List<Student> getStudents(InputStream inStream) throws Throwable
  12. {
  13. List<Student> students = null;
  14. Student mStudent = null;
  15. //========创建XmlPullParser,有两种方式=======
  16. //方式一:使用工厂类XmlPullParserFactory
  17. XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
  18. XmlPullParser parser = pullFactory.newPullParser();
  19. //方式二:使用Android提供的实用工具类android.util.Xml
  20. //XmlPullParser parser = Xml.newPullParser();
  21. //解析文件输入流
  22. parser.setInput(inStream, "UTF-8");
  23. //产生第一个事件
  24. int eventType = parser.getEventType();
  25. //只要不是文档结束事件,就一直循环
  26. while(eventType!=XmlPullParser.END_DOCUMENT)
  27. {
  28. switch (eventType)
  29. {
  30. //触发开始文档事件
  31. case XmlPullParser.START_DOCUMENT:
  32. students = new ArrayList<Student>();
  33. break;
  34. //触发开始元素事件
  35. case XmlPullParser.START_TAG:
  36. //获取解析器当前指向的元素的名称
  37. String name = parser.getName();
  38. if("student".equals(name))
  39. {
  40. //通过解析器获取id的元素值,并设置student的id
  41. mStudent = new Student();
  42. mStudent.setId(parser.getAttributeValue(0));
  43. }
  44. if(mStudent!=null)
  45. {
  46. if("name".equals(name))
  47. {
  48. //获取解析器当前指向元素的下一个文本节点的值
  49. mStudent.setName(parser.nextText());
  50. }
  51. if("age".equals(name))
  52. {
  53. //获取解析器当前指向元素的下一个文本节点的值
  54. mStudent.setAge(new Short(parser.nextText()));
  55. }
  56. if("sex".equals(name))
  57. {
  58. //获取解析器当前指向元素的下一个文本节点的值
  59. mStudent.setSex(parser.nextText());
  60. }
  61. }
  62. break;
  63. //触发结束元素事件
  64. case XmlPullParser.END_TAG:
  65. //
  66. if("student".equals(parser.getName()))
  67. {
  68. students.add(mStudent);
  69. mStudent = null;
  70. }
  71. break;
  72. default:
  73. break;
  74. }
  75. eventType = parser.next();
  76. }
  77. return students;
  78. }
  79. }

[4] 该Demo的入口类:MainActivity.java

[html] view plaincopy

    1. package com.andyidea.xmlparser;
    2. import java.io.InputStream;
    3. import java.util.List;
    4. import com.andyidea.entity.Student;
    5. import com.andyidea.util.ParserByPULL;
    6. import android.app.Activity;
    7. import android.content.res.AssetManager;
    8. import android.os.Bundle;
    9. import android.util.Log;
    10. public class MainActivity extends Activity {
    11. /** Called when the activity is first created. */
    12. @Override
    13. public void onCreate(Bundle savedInstanceState) {
    14. super.onCreate(savedInstanceState);
    15. setContentView(R.layout.main);
    16. AssetManager asset = getAssets();
    17. try {
    18. InputStream input = asset.open("student.xml");
    19. List<Student> list = ParserByPULL.getStudents(input);
    20. for (Student stu : list) {
    21. Log.e("StudentInfo","Person ID: " + stu.getId() + ","
    22. + stu.getName() + ", " + stu.getAge() + ", "
    23. + stu.getSex());
    24. }
    25. } catch (Throwable e) {
    26. e.printStackTrace();
    27. }
    28. }
时间: 2024-11-05 18:49:48

Android中使用PULL方式解析XML文件的相关文章

通过Pull方式解析xml文件

说明:此案例使用的是通过Sax方式解析xml文件这篇文章里的布局文件.City类和china.xml文件(此文件内包含两种格式),所以只需要完成MainActivity和PullXml就行了,在于展示如何使用Pull方式解析xml文件. 1. PullXml类的主要代码如下: <span style="font-size:14px;">public class PullXml { public List<City> pullXml() { List<Cit

Android中通过SAX方式解析XML

每个访问网络的应用程序都有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据.那么,这些数据是用什么格式在网络上传输的呢?一般,我们会在网络上传输一些格式化的数据,这些数据有一定的结构和语义.另一方收到数据消息后就可以按照相同的结构规格来进行解析,从而获取到想要的那部分内容. 网络上传输数据最常用的格式有两种,XML和JSON.下面,我们介绍通过SAX方式来解析XML. 首先,进行准备一段XML格式的数据. get_data.xml 1 <apps> 2 <app>

pull 方式解析xml文件

XmlPullParser解析xml的android文档docs/reference/org/xmlpull/v1/XmlPullParser.html xmlPullParer官网:http://www.xmlpull.org/ 例子:要解析的文件:pull.xml <?xml version="1.0" encoding="UTF-8"?> <Customer>  <PersonName>   <SurName>张

安卓系列三(使用pull 方式解析xml文件)

import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import android.annotation.SuppressLint; import android.util.Xml; imp

Pull方式解析XML文件

package com.pingyijinren.test; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import a

利用pull方式进行xml文件查看天气

1.需要使用到的java文件 解析china.xml文件中的内容. 利用pull方式进行xml文件步骤: ①直接创建出XmlPullParser解析器对象  XmlPullParser xmlPullParser = Xml.newPullParser(); ②设置解析的文件输入流 并且制定输入流在操作方式中的编码方式    xmlPullParser.setInput(getClass().getClassLoader().getResourceAsStream("china.xml"

Java之Pull方式生成xml文件和解析xml文件

Pull XML解析器早已经被google集成到android sdk当中,它是google官方推荐的解析器. 如果我们要在Java桌面.J2ME等当中使用Pull方式生成xml文件和解析xml文件,需要用到kxml2: KXML解析器是基于普通XML PULL解析器的一个小巧的解析器,官网是http://kxml.org/ 普通XML PULL解析器的官网是http://xmlpull.org/ 实验开始: 在Eclipse中新建一个java项目,其中新建一个libs文件夹,拷贝从网上下载的k

Android开发学习---使用XmlPullParser解析xml文件

Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将主要介绍pull解析器解析xml文件,环境为ubuntu 12.04+ intelij 13.1 + android sdk 2.1 一.创建一个XML项目,步骤如下: 二.解析一个xml文件: assets/person.xml <?xml version="1.0" encodi

SAX方式解析xml文件查看天气

1.SAX方式解析xml文件的步骤: ①创建解析器工厂对象 ②使用当前配置的工厂参数创建SAXParser对象 ③解析xml文件 ④利用DefaultHandler创建事件驱动者 2.对于标签对象进行引用怎么办? ①定义当前解析的标签:private String tagName=null; ②在startElement()方法中赋值tagName:this.tagName=qName; ③在endElement()方法中将tagName赋值为空:this.tagName=null; ④在cha