zoukankan      html  css  js  c++  java
  • Android使用pull解析xml

    一、理论准备

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

        工程结构如下:

                          image

        为什么把xml放在assets目录下呢,它和res/values目录的区别是系统不分配ID,好像没解决问题,暂时没查到资料。

    二、上代码

    package com.example.and_0003;
    
    import java.io.InputStream;
    
    import java.util.List;
    
    import com.hpu.entity.Student;
    
    import com.hpu.util.PullService;
    
    import android.app.Activity;
    
    import android.content.res.AssetManager;
    
    import android.os.Bundle;
    
    import android.util.Log;
    
    public class MainActivity extends Activity {
    
        /** Called when the activity is first created. */
    
        @Override
    
        public void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
            
    
            AssetManager asset = getAssets();
    
            try {
    
                InputStream input = asset.open("student.xml");
    
                List<Student> list = PullService.getStudents(input);
    
                for (Student stu : list) {
    
                       Log.e("StudentInfo","Person ID: " + stu.getId() + ","
    
                             + stu.getName() + ", " + stu.getAge() + ", "
    
                             + stu.getSex());
    
                }
    
            } catch (Throwable e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }

      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>

    package com.hpu.entity;
    public class Student {
    	
    	private String id;
    	private String name;
    	private int age;
    	private String sex;
    	
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    
    }

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

                 image

    五、遗留问题及参考文献

        Dom和SAX和Pull的适用范围分别是什么?

                  http://blog.csdn.net/cjjky/article/details/6667744

  • 相关阅读:
    Eclipse安装Hadoop插件
    (转)Ubuntu14.0.4中hadoop2.4.0伪分布模式配置
    Hadoop--DataNode无法启动
    启动与关闭hadoop
    hadoop中执行命令时发生错误
    strings命令
    Deriving data from ElasticSearch Engine
    elasticsearch data importing
    reading words in your computer and changing to female voice, linux festival text2wave saving wav files
    DDNS client on a Linux machine
  • 原文地址:https://www.cnblogs.com/hxsyl/p/3652058.html
Copyright © 2011-2022 走看看