zoukankan      html  css  js  c++  java
  • 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.   
    3. public class Student {  
    4.       
    5.     private String id;  
    6.     private String name;  
    7.     private int age;  
    8.     private String sex;  
    9.       
    10.     public String getId() {  
    11.         return id;  
    12.     }  
    13.     public void setId(String id) {  
    14.         this.id = id;  
    15.     }  
    16.     public String getName() {  
    17.         return name;  
    18.     }  
    19.     public void setName(String name) {  
    20.         this.name = name;  
    21.     }  
    22.     public int getAge() {  
    23.         return age;  
    24.     }  
    25.     public void setAge(int age) {  
    26.         this.age = age;  
    27.     }  
    28.     public String getSex() {  
    29.         return sex;  
    30.     }  
    31.     public void setSex(String sex) {  
    32.         this.sex = sex;  
    33.     }  
    34.   
    35. }  


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

    [html] view plaincopy
     
    1. package com.andyidea.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 android.util.Xml;  
    11.   
    12. import com.andyidea.entity.Student;  
    13.   
    14. public class ParserByPULL {  
    15.       
    16.     //采用XmlPullParser来解析XML文件    
    17.     public static List<Student> getStudents(InputStream inStream) throws Throwable   
    18.     {    
    19.         List<Studentstudents = 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.         {    
    36.             switch (eventType)     
    37.             {    
    38.                 //触发开始文档事件    
    39.                 case XmlPullParser.START_DOCUMENT:    
    40.                     students = new ArrayList<Student>();    
    41.                     break;    
    42.                 //触发开始元素事件    
    43.                 case XmlPullParser.START_TAG:    
    44.                     //获取解析器当前指向的元素的名称    
    45.                     String name = parser.getName();    
    46.                     if("student".equals(name))    
    47.                     {    
    48.                         //通过解析器获取id的元素值,并设置student的id    
    49.                         mStudent = new Student();    
    50.                         mStudent.setId(parser.getAttributeValue(0));    
    51.                     }    
    52.                     if(mStudent!=null)    
    53.                     {    
    54.                         if("name".equals(name))    
    55.                         {    
    56.                             //获取解析器当前指向元素的下一个文本节点的值    
    57.                             mStudent.setName(parser.nextText());    
    58.                         }    
    59.                         if("age".equals(name))    
    60.                         {    
    61.                             //获取解析器当前指向元素的下一个文本节点的值    
    62.                             mStudent.setAge(new Short(parser.nextText()));    
    63.                         }  
    64.                         if("sex".equals(name))  
    65.                         {  
    66.                             //获取解析器当前指向元素的下一个文本节点的值    
    67.                             mStudent.setSex(parser.nextText());  
    68.                         }  
    69.                     }    
    70.                     break;    
    71.                 //触发结束元素事件    
    72.                 case XmlPullParser.END_TAG:    
    73.                     //    
    74.                     if("student".equals(parser.getName()))    
    75.                     {    
    76.                         students.add(mStudent);    
    77.                         mStudent = null;    
    78.                     }    
    79.                     break;    
    80.                 default:    
    81.                     break;    
    82.             }    
    83.             eventType = parser.next();    
    84.         }    
    85.         return students;    
    86.     }    
    87.   
    88. }  

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

    [html] view plaincopy
     
      1. package com.andyidea.xmlparser;  
      2.   
      3. import java.io.InputStream;  
      4. import java.util.List;  
      5.   
      6. import com.andyidea.entity.Student;  
      7. import com.andyidea.util.ParserByPULL;  
      8.   
      9. import android.app.Activity;  
      10. import android.content.res.AssetManager;  
      11. import android.os.Bundle;  
      12. import android.util.Log;  
      13.   
      14. public class MainActivity extends Activity {  
      15.     /** Called when the activity is first created. */  
      16.     @Override  
      17.     public void onCreate(Bundle savedInstanceState) {  
      18.         super.onCreate(savedInstanceState);  
      19.         setContentView(R.layout.main);  
      20.           
      21.         AssetManager asset = getAssets();  
      22.         try {  
      23.             InputStream input = asset.open("student.xml");  
      24.             List<Studentlist = ParserByPULL.getStudents(input);  
      25.             for (Student stu : list) {  
      26.                    Log.e("StudentInfo","Person ID: " + stu.getId() + ","  
      27.                          + stu.getName() + ", " + stu.getAge() + ", "  
      28.                          + stu.getSex());  
      29.             }  
      30.         } catch (Throwable e) {  
      31.             e.printStackTrace();  
      32.         }  
      33.     }  
  • 相关阅读:
    Java练习 SDUT-3328_JAVA判断合法标识符
    问题2:css图片、文字居中
    问题1:jquery实现全选功能,第二次失效(已解决)
    问题2:input、textarea、submit 宽度设置为100%,但显示宽度不一致
    问题1:设置了text-overflow : ellipsis未起作用
    问题1:canvas绘制图片加载不出来
    问题1:鼠标指向导航栏li,但li中a样式未改变
    Shell工具| 流程控制
    Hadoop |集群的搭建
    MySQL高级01
  • 原文地址:https://www.cnblogs.com/lingyi1111/p/4499310.html
Copyright © 2011-2022 走看看