XML解析之二 SAX解析器

接上一章,这一章我们就来学习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.     @Override  
  22.     public void characters(char[] ch, int start, int length)  
  23.             throws SAXException  
  24.      
  25.         String data new String(ch, start, length);  
  26.         if("status".equals(tagName)){  
  27.             person.setStatus(data);  
  28.          
  29.         if("name".equals(tagName)){  
  30.             person.setName(data);  
  31.          
  32.         if("tool".equals(tagName)){  
  33.             person.setTool(data);  
  34.          
  35.         if("number".equals(tagName)){  
  36.             person.setNumber(data);  
  37.          
  38.      
  39.   
  40.       
  41.       
  42.     @Override  
  43.     public void endElement(String uri, String localName, String qName)  
  44.             throws SAXException  
  45.      
  46.         if("person".equals(localName)){  
  47.             persons.add(person);  
  48.             person null 
  49.          
  50.         tagName null 
  51.           
  52.      
  53.       
  54.       
  55.     @Override  
  56.     public void startDocument() throws SAXException  
  57.      
  58.         persons new ArrayList<Person>();  
  59.      
  60.       
  61.       
  62.     @Override  
  63.     public void startElement(String uri, String localName, String qName,  
  64.             Attributes attributes) throws SAXException  
  65.      
  66.         if("person".equals(localName)){  
  67.             person new Person();  
  68.             person.setId(attributes.getValue("id"));  
  69.          
  70.         tagName localName;//将正在解析的节点名称赋给tagName    
  71.      
  72.       
  73.  

接着就是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 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(thislists, 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、付费专栏及课程。

余额充值