Android開發進階(二)--XML檔案解析之PULL模式解析

來源:互聯網
上載者:User

Pull模式解析原理:
與SAX解析器類比相似,也提供了類似的事件驅動.使用parser.next()可以進入下一個元素並觸發相應事件。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以擷取下一個Text類型元素的值。
Pull模式解析步驟:
1、  得到一個XmlPullParser對象這裡得到XMLPullParser對象的方式有兩種:
       1)通過Xml這個工具類的.newPullParser()方式得到
       2)通過XmlPullParserFactory工廠建立
//得到XmlPullParserFacotry工廠

XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
 
XmlPullParser xmlparser = factory.newPullParser(); 

2、  再根據XmlPullParser對象設定輸入資料流和編碼格式

parser.setInput(inputStream, "UTF-8"); 

3、  然後迴圈遍曆所有的結點可以通過文檔開始的代碼來判斷讀入到哪個節點
 
關於xmlparser.getEventType()其值有:
Start_DOCUMENT:文檔開始
END_DOCUMENT:文檔結束
START_TAG:開始讀標籤
END_TAG:標籤結束
TEXT:所讀的是常值內容
 
 
一個簡單樣本:

import java.io.IOException; 
import java.io.StringReader; 
import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlpull.v1.XmlPullParserFactory; 
public class SimpleXmlPullApp{ 
     public static void main (String args[])  throws XmlPullParserException, IOException{ 
 
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
       factory.setNamespaceAware(true); 
        XmlPullParser xpp = factory.newPullParser();  
 
        xpp.setInput( new StringReader ( "<foo>Hello World!</foo>" ) ); 
 
        int eventType = xpp.getEventType(); 
 
        while (eventType != XmlPullParser.END_DOCUMENT) { 
 
         if(eventType == XmlPullParser.START_DOCUMENT) { 
 
             System.out.println("Start document"); 
 
         } else if(eventType == XmlPullParser.START_TAG) { 
 
             System.out.println("Start tag "+xpp.getName()); 
 
         } else if(eventType == XmlPullParser.END_TAG) { 
 
             System.out.println("End tag "+xpp.getName()); 
 
         } else if(eventType == XmlPullParser.TEXT) { 
 
             System.out.println("Text "+xpp.getText()); 
 
         } 
         eventType = xpp.next(); 
        } 
        System.out.println("End document"); 
    } 

輸出結果:
Start document
Start tag foo
Text Hello World!
End tag foo
  還是以上一節的例子:讀取XML檔案裡的內容把這些內容構造成一個Person對象,然後讀取這個XML文檔裡內容將其Person對象添加到一個List集合裡
person.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persons> 
       <person id="23"> 
              <name>李明</name> 
              <age>30</age> 
       </person> 
       <person id="20"> 
              <name>李向梅</name> 
              <age>25</age> 
       </person> 
</persons> 
Person類:

public class Person { 
 
    private Integer id; 
    private String name; 
    private short age;     
    public Integer getId() { 
       return id; 
    } 
    public void setId(Integer id) { 
       this.id = id; 
    } 
     public String getName() { 
       return name; 
    } 
    public void setName(String name) { 
       this.name = name; 
    } 
     public short getAge() { 
       return age; 
    } 
    public void setAge(short age) { 
       this.age = age; 
    }  
    @Override 
    public String toString() { 
       return "Person [age=" + age + ", id=" + id + ", name=" + name + "]"; 
    } 

業務bean

public static List<Person> readXml(InputStream inputStream) 
 
         throws Exception { 
 
     List<Person> persons=null; 
 
     // XMLPullParser對象 
 
     XmlPullParser parser = Xml.newPullParser(); 
 
     //設定輸入資料流和編碼 
 
     parser.setInput(inputStream, "UTF-8"); 
 
     // 檔案開始代碼 
 
     int eventCode = parser.getEventType(); 
 
     Person person = null; 
 
     while (eventCode != XmlPullParser.END_DOCUMENT) { 
 
         switch (eventCode) { 
 
         //文檔開始 
 
         case XmlPullParser.START_DOCUMENT: 
 
            // 初始化 
 
            persons = new ArrayList<Person>(); 
 
            break; 
 
         case XmlPullParser.START_TAG: //開始標籤 
 
            if ("person".equals(parser.getName())) { 
 
               person = new Person(); 
 
               person.setId(Integer.parseInt(parser.getAttributeValue(0))); 
 
            } 
 
            else if(person!=null){ 
 
                if ("name".equals(parser.getName())) { 
 
                   //nextNext()如果下一個元素的內容是文本的時候適合用 
 
                   person.setName(parser.nextText()); 
 
                } 
                else if("age".equals(parser.getName())){ 
                   person.setAge(new Short(parser.nextText())); 
 
                } 
            } 
            break; 
         case  XmlPullParser.END_TAG://結束標籤 
 
            if ("person".equals(parser.getName()) && person!=null) { 
 
                persons.add(person); 
 
                person=null;//再擲為null 
 
            } 
 
            break;      
 
         } 
         // 下一個節點  www.2cto.com
         eventCode = parser.next(); 
     } 
     return persons; 
  } 

 
 
測試:

public class SAXPersonServiceTest extends AndroidTestCase { 
 
     private static final String TAG = "LogTest"; 
 
//PULL方式 
    public void testPULLReadXml() throws Exception { 
 
        System.out.println("testPULLReadXml"); 
 
       InputStream inputStream = SAXPersonServiceTest.class.getClassLoader() 
 
              .getResourceAsStream("person.xml"); 
 
       List<Person> list = PULLPersonService.readXml(inputStream); 
 
        System.out.println(list.size()); 
  
       for (Person person : list) { 
           System.out.println(person); 
       } 
  
    } 
 


摘自 jiahui524專欄
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.