天天看點

xml解析--Pull方式

xml資料解析 Pull解析方式     Pull是Android内置的xml解析器(在Android項目中使用Pull解析不需要導入jar包),Android内部的xml檔案的解析都使用了Pull解析器。Pull解析器的運作方式與SAX 解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素并觸發相應事件。事件将作為數值代碼被發送,是以可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以擷取下一個Text類型節點的值。

得到一個XmlPullParser對象這裡得到XMLPullParser對象的方式有兩種:        1)通過Xml這個工具類的.newPullParser()方式得到(在Android工程中可以使用)        2)通過XmlPullParserFactory工廠建立

讀取到xml的聲明傳回數字0 START_DOCUMENT; 讀取到xml的結束傳回數字1 END_DOCUMENT ;

讀取到xml的開始标簽傳回數字2 START_TAG

讀取到xml的結束标簽傳回數字3 END_TAG 讀取到xml的文本傳回數字4 TEXT test.xml檔案 <? xml version = "1.0" encoding = "UTF-8" ?> < persons >       < person id = "23" >           < name > liming </ name >           < age > 30 </ age >       </ person >       < person id = "20" >           < name > lixiangmei </ name >           < age > 25 </ age >       </ person >   </ persons > 解析的java檔案(建立的是java工程,是以需要導入xml2-2.3.0.jar,xmlpull_1_1_3_4c.jar,實體類Person省略,其中有id,name,age三個屬性,隻有setter和getter方法) package com.hngd.xmldemo;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream.GetField;

import java.io.OutputStream;

import java.io.StringReader;

import java.util.ArrayList;

import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlPullParserException;

import org.xmlpull.v1.XmlPullParserFactory;

public class XmlDemo {

     public static void main(String[] args) {

          XmlDemo xml = new XmlDemo();

          FileInputStream in;

          try {

               in = new FileInputStream(new File("D:\\eclipseWorkSpace\\JsonDemo\\src\\com\\hngd\\xmldemo\\test2.xml"));

               List<Person> list = xml.parseXml(in);

               System.out.println(list.get(0));

               System.out.println(list.get(1));

          } catch (FileNotFoundException e) {

               e.printStackTrace();

          }

     }

     private List<Person> parseXml(InputStream in){

          List<Person> list = null;

          Person person = null;

          try {

               XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//擷取Pull解析工廠

               XmlPullParser xmlPullparser = factory.newPullParser();//擷取XmlPullParser的執行個體

               //XmlPullParser xmlPullparser = Xml.newPullParser();  //安卓工程中使用Xml工具擷取Pull解析器

               xmlPullparser.setInput(in,"UTF-8");  // 設定需要解析的XML資料

               int eventType = xmlPullparser.getEventType();

               while(eventType != XmlPullParser.END_DOCUMENT){   //不是文檔的結尾

                    switch (eventType) {

                    case XmlPullParser.START_DOCUMENT:  //1、文檔開始。如果為開始解析頭标簽START_DOCUMENT,初始化資料

                         list = new ArrayList<Person>();

                         break;

                    case XmlPullParser.START_TAG:      //2、标簽開始。如果為開始解析屬性START_TAG,則擷取資料

                         String name = xmlPullparser.getName(); //目前指向元素的名稱(節點名稱)

                         if("person".equals(name)){

                              person = new Person();

                              person.setId(Integer.parseInt(xmlPullparser.getAttributeValue(0)));

                         }

                         if(person!=null){

                              if("name".equals(name)){

                                   person.setName(xmlPullparser.nextText());

                              }

                              if("age".equals(name)){

                                   person.setAge(Integer.parseInt(xmlPullparser.nextText()));

                              }

                         }

                         break;

                    case XmlPullParser.END_TAG:     //3、标簽結束。當觸發xml文檔結束事件的名稱為person(即解析結束位置),将封裝對象放入集合,再将對象制空

                         if("person".equals(xmlPullparser.getName())){

                              list.add(person);

                              person = null;

                         }

                         break;

                    }

                    eventType = xmlPullparser.next();

               }

          } catch (XmlPullParserException e) {

               e.printStackTrace();

          } catch (IOException e) {

               e.printStackTrace();

          }

          return list;

     } }