2025-02-10

 

接上一章,這一章我們就來學習SAX解析器,其實SAX跟PULL解析器差不多,事實上學會和掌握一種XML解析器對於完成項目來說已經足夠瞭,當然,多學一點也不是什麼壞事,你說呢?呵呵,加油哦!我們還是以唐僧師徙的數據為例

 

 

<?xml version="1.0" encoding="UTF-8"?>   

<persons>   

    <person id = "1">   

        <status>大徙弟</status>   

        <name>孫悟空</name>   

        <tool>金箍棒</tool>   

        <number>殺死瞭50隻妖怪</number>   

    </person>   

       

    <person id = "2">   

        <status>二徙弟</status>   

        <name>豬八戒</name>   

        <tool>九齒釘耙</tool>   

        <number>殺死瞭40隻妖怪</number>   

    </person>   

       

    <person id = "3">   

        <status>三徙弟</status>   

        <name>沙和尚</name>   

        <tool>降妖寶杖</tool>   

        <number>殺死瞭30隻妖怪</number>   

    </person>   

   

</persons>   

 

 

xml文件跟上一章的一樣,如果不清楚的話可以參考一下上一章

 

Android[中級教程]第五章XML解析之PULL解析器

這裡我就主要放上SAXHandler的源碼瞭

 

 

import java.util.ArrayList; 

import java.util.List; 

 

import org.xml.sax.Attributes; 

import org.xml.sax.SAXException; 

import org.xml.sax.helpers.DefaultHandler; 

 

public class SaxHandler extends DefaultHandler 

    private List<Person> persons; 

    private Person person; 

    private String tagName;//作用是記錄解析時的上一個節點名稱  

     

     

    public List<Person> getPersons(){ 

         

        return persons; 

    }  www.aiwalls.com

      

    /**

     * 節點處理

     */ 

    @Override 

    public void characters(char[] ch, int start, int length) 

            throws SAXException 

    { 

        String data = new String(ch, start, length); 

        if("status".equals(tagName)){ 

            person.setStatus(data); 

        } 

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

            person.setName(data); 

        } 

        if("tool".equals(tagName)){ 

            person.setTool(data); 

        } 

        if("number".equals(tagName)){ 

            person.setNumber(data); 

        } 

    } 

 

     

    /**

     * 元素結束

     */ 

    @Override 

    public void endElement(String uri, String localName, String qName) 

            throws SAXException 

    { 

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

            persons.add(person); 

            person = null; 

        } 

        tagName = null; 

         

    } 

     

    /**

     * 文檔開始

     */ 

    @Override 

    public void startDocument() throws SAXException 

    { 

        persons = new ArrayList<Person>(); 

    } 

     

    /**

     * 元素開始

     */ 

    @Override 

    public void startElement(String uri, String localName, String qName, 

            Attributes attributes) throws SAXException 

    { 

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

            person = new Person(); 

            person.setId(attributes.getValue("id")); 

        } 

        tagName = localName;//將正在解析的節點名稱賦給tagName  

    } 

     

接著就是Activity中的源碼:

 

 

import java.io.File; 

import java.io.FileInputStream; 

import java.util.ArrayList; 

import java.util.HashMap; 

import java.util.List; 

import java.util.Map; 

 

import javax.xml.parsers.SAXParser; 

import javax.xml.parsers.SAXParserFactory; 

 

import android.app.Activity; 

import android.os.Bundle; 

import android.os.Environment; 

import android.widget.ListView; 

import android.widget.SimpleAdapter; 

 

public class PullActivity extends Activity 

     

    private ListView listView; 

    private SimpleAdapter adapter; 

 

    @Override 

    protected void onCreate(Bundle savedInstanceState) 

    { 

        // TODO Auto-generated method stub 

        super.onCreate(savedInstanceState); 

        setContentView(R.layout.xml_handler); 

         

        listView = (ListView)findViewById(R.id.xml_list); 

        try 

        { 

            //自完義適配方法 

            getAdapter(); 

             

        } catch (Exception e) 

        { 

            e.printStackTrace(); 

        } 

        listView.setAdapter(adapter); 

    } 

 

    //自定義適配方法 

    private void getAdapter() throws Exception 

    { 

        List<Map<String, String>> lists = new ArrayList<Map<String, String>>(); 

          

        //這一部分就是剛才我們做測試用的部分 

        File SD_Files = Environment.getExternalStorageDirectory(); 

        String file_path = SD_Files.getName() + File.separator + "persons.xml"; 

//      FileInputStream input = new FileInputStream(new File(file_path)); 

//      PullHandler pullHandler = new PullHandler(input); 

//      List<Person> persons = pullHandler.getPersons(); 

        FileInputStream fis = new FileInputStream(new File(file_path)); 

        SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 

        SaxHandler saxHandler = new SaxHandler(); 

        parser.parse(fis, saxHandler); 

        List<Person> persons = saxHandler.getPersons(); 

         

        //將persons中的數據轉換到ArrayList<Map<String, String>>中,因為SimpleAdapter要用這個類型的數據進行適配 

        Map<String, String> map; 

        for(Person p : persons){ 

            map = new HashMap<String, String>(); 

             

            map.put("id", p.getId()); 

            map.put("status", p.getStatus()); 

            map.put("name", p.getName()); 

            map.put("tool", p.getTool()); 

            map.put("number", p.getNumber()); 

             

            lists.add(map); 

        } 

         

        //HashMap<String, String>中的key 

        String[] from = {"id", "status", "name", "tool", "number"}; 

        //list_item.xml中對應的控件ID 

        int[] to = {R.id.item_id, R.id.item_status, R.id.item_name, R.id.item_tool, R.id.item_number}; 

         

        adapter = new SimpleAdapter(this, lists, R.layout.handler_list_item, from, to); 

         

    } 

其他的跟PULL解析都一樣的,這裡隻是將PULL解析換成瞭SAX解析,在源碼中就是把中間的三行代碼換成瞭SAX解析的代碼,上圖:

看,都是一樣的,下一章要介紹DOM解析器瞭,希望大傢能好好學習,謝謝

摘自:kangkangz4的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *