Android[中級教程]第六章 XML解析之SAX解析器

來源:互聯網
上載者:User

接上一章,這一章我們就來學習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;}/** * 節點處理 */@Overridepublic 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);}}/** * 元素結束 */@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException{if("person".equals(localName)){persons.add(person);person = null;}tagName = null;}/** * 文檔開始 */@Overridepublic void startDocument() throws SAXException{persons = new ArrayList<Person>();}/** * 元素開始 */@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState){// TODO Auto-generated method stubsuper.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>中的keyString[] from = {"id", "status", "name", "tool", "number"};//list_item.xml中對應的控制項IDint[] 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解析器了,希望大家能好好學習,謝謝

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.