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

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

分类: Android中级   125人阅读  评论(1)  收藏  举报

接上一章,这一章我们就来学习SAX解析器,其实SAX跟PULL解析器差不多,事实上学会和掌握一种XML解析器对于完成项目来说已经足够了,当然,多学一点也不是什么坏事,你说呢?呵呵,加油哦!我们还是以唐僧师徙的数据为例

  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <persons>    
  3.     <person id = "1">    
  4.         <status>大徙弟</status>    
  5.         <name>孙悟空</name>    
  6.         <tool>金箍棒</tool>    
  7.         <number>杀死了50只妖怪</number>    
  8.     </person>    
  9.         
  10.     <person id = "2">    
  11.         <status>二徙弟</status>    
  12.         <name>猪八戒</name>    
  13.         <tool>九齿钉耙 </tool>    
  14.         <number>杀死了40只妖怪</number>    
  15.     </person>    
  16.         
  17.     <person id = "3">    
  18.         <status>三徙弟</status>    
  19.         <name>沙和尚</name>    
  20.         <tool>降妖宝杖</tool>    
  21.         <number>杀死了30只妖怪</number>    
  22.     </person>    
  23.     
  24. </persons>    

 

xml文件跟上一章的一样,如果不清楚的话可以参考一下上一章

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

这里我就主要放上SAXHandler的源码了

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import org.xml.sax.Attributes;  
  5. import org.xml.sax.SAXException;  
  6. import org.xml.sax.helpers.DefaultHandler;  
  7.   
  8. public class SaxHandler extends DefaultHandler  
  9. {  
  10.     private List<Person> persons;  
  11.     private Person person;  
  12.     private String tagName;//作用是记录解析时的上一个节点名称   
  13.       
  14.       
  15.     public List<Person> getPersons(){  
  16.           
  17.         return persons;  
  18.     }  
  19.       
  20.     /** 
  21.      * 节点处理 
  22.      */  
  23.     @Override  
  24.     public void characters(char[] ch, int start, int length)  
  25.             throws SAXException  
  26.     {  
  27.         String data = new String(ch, start, length);  
  28.         if("status".equals(tagName)){  
  29.             person.setStatus(data);  
  30.         }  
  31.         if("name".equals(tagName)){  
  32.             person.setName(data);  
  33.         }  
  34.         if("tool".equals(tagName)){  
  35.             person.setTool(data);  
  36.         }  
  37.         if("number".equals(tagName)){  
  38.             person.setNumber(data);  
  39.         }  
  40.     }  
  41.   
  42.       
  43.     /** 
  44.      * 元素结束 
  45.      */  
  46.     @Override  
  47.     public void endElement(String uri, String localName, String qName)  
  48.             throws SAXException  
  49.     {  
  50.         if("person".equals(localName)){  
  51.             persons.add(person);  
  52.             person = null;  
  53.         }  
  54.         tagName = null;  
  55.           
  56.     }  
  57.       
  58.     /** 
  59.      * 文档开始 
  60.      */  
  61.     @Override  
  62.     public void startDocument() throws SAXException  
  63.     {  
  64.         persons = new ArrayList<Person>();  
  65.     }  
  66.       
  67.     /** 
  68.      * 元素开始 
  69.      */  
  70.     @Override  
  71.     public void startElement(String uri, String localName, String qName,  
  72.             Attributes attributes) throws SAXException  
  73.     {  
  74.         if("person".equals(localName)){  
  75.             person = new Person();  
  76.             person.setId(attributes.getValue("id"));  
  77.         }  
  78.         tagName = localName;//将正在解析的节点名称赋给tagName   
  79.     }  
  80.       
  81. }  

接着就是Activity中的源码:

  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import javax.xml.parsers.SAXParser;  
  9. import javax.xml.parsers.SAXParserFactory;  
  10.   
  11. import android.app.Activity;  
  12. import android.os.Bundle;  
  13. import android.os.Environment;  
  14. import android.widget.ListView;  
  15. import android.widget.SimpleAdapter;  
  16.   
  17. public class PullActivity extends Activity  
  18. {  
  19.       
  20.     private ListView listView;  
  21.     private SimpleAdapter adapter;  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState)  
  25.     {  
  26.         // TODO Auto-generated method stub  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.xml_handler);  
  29.           
  30.         listView = (ListView)findViewById(R.id.xml_list);  
  31.         try  
  32.         {  
  33.             //自完义适配方法  
  34.             getAdapter();  
  35.               
  36.         } catch (Exception e)  
  37.         {  
  38.             e.printStackTrace();  
  39.         }  
  40.         listView.setAdapter(adapter);  
  41.     }  
  42.   
  43.     //自定义适配方法  
  44.     private void getAdapter() throws Exception  
  45.     {  
  46.         List<Map<String, String>> lists = new ArrayList<Map<String, String>>();  
  47.           
  48.         //这一部分就是刚才我们做测试用的部分  
  49.         File SD_Files = Environment.getExternalStorageDirectory();  
  50.         String file_path = SD_Files.getName() + File.separator + "persons.xml";  
  51. //      FileInputStream input = new FileInputStream(new File(file_path));  
  52. //      PullHandler pullHandler = new PullHandler(input);  
  53. //      List<Person> persons = pullHandler.getPersons();  
  54.         FileInputStream fis = new FileInputStream(new File(file_path));  
  55.         SAXParser parser = SAXParserFactory.newInstance().newSAXParser();  
  56.         SaxHandler saxHandler = new SaxHandler();  
  57.         parser.parse(fis, saxHandler);  
  58.         List<Person> persons = saxHandler.getPersons();  
  59.           
  60.         //将persons中的数据转换到ArrayList<Map<String, String>>中,因为SimpleAdapter要用这个类型的数据进行适配  
  61.         Map<String, String> map;  
  62.         for(Person p : persons){  
  63.             map = new HashMap<String, String>();  
  64.               
  65.             map.put("id", p.getId());  
  66.             map.put("status", p.getStatus());  
  67.             map.put("name", p.getName());  
  68.             map.put("tool", p.getTool());  
  69.             map.put("number", p.getNumber());  
  70.               
  71.             lists.add(map);  
  72.         }  
  73.           
  74.         //HashMap<String, String>中的key  
  75.         String[] from = {"id""status""name""tool""number"};  
  76.         //list_item.xml中对应的控件ID  
  77.         int[] to = {R.id.item_id, R.id.item_status, R.id.item_name, R.id.item_tool, R.id.item_number};  
  78.           
  79.         adapter = new SimpleAdapter(this, lists, R.layout.handler_list_item, from, to);  
  80.           
  81.     }  
  82. }  

其他的跟PULL解析都一样的,这里只是将PULL解析换成了SAX解析,在源码中就是把中间的三行代码换成了SAX解析的代码,上图:

看,都是一样的,下一章要介绍DOM解析器了,希望大家能好好学习,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值