Android SAX解析XML

       本篇讲解一下SAX解析XML这种方式,首先来看一下它的基本介绍:

SAX是一种以事件驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的讲,它是种解析速度快,占用内存少的解析器。这种解析器比较适合android等移动设备。

使用SAX的优点:

        因为SAX的优势是流的处理方式,当遇到一个标签的时候,并不会记录下当前所碰到的标签。也就是说,startElement的方法中,你所知道的信息,仅仅是当前的签名的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元素与其他结构相关的信息,都是不知道的。

我们需要使用DefaultHandler这个类来解析

类 DefaultHandler

java.lang.Object
  org.xml.sax.helpers.DefaultHandler

 

我们通过一个简单的实例来看一下如何使用SAX解析XML这门技术:

工程目录结构

几个重要java类的源代码:

MyHandler.java

 1 package com.sax.handler;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 import org.xml.sax.Attributes;
 8 import org.xml.sax.SAXException;
 9 import org.xml.sax.helpers.DefaultHandler;
10 
11 public class MyHandler extends DefaultHandler{
12     private HashMap<String,String> map = null;    //存储单个解析出来的对象
13     private List<HashMap<String,String>> list = null;    //存储所有解析出来的对象
14     private String currentTag = null;    //正在解析的元素的标签
15     private String currentValue = null; //当前解析的元素的值
16     private String nodeName;    //当前解析的结点名称
17     
18     public MyHandler(String nodeName) {
19         this.nodeName = nodeName;
20     }
21 
22     public List<HashMap<String, String>> getList() {
23         return list;
24     }
25     //当读取到第一个开始标签时候触发该事件
26     @Override
27     public void startDocument() throws SAXException {
28         list = new ArrayList<HashMap<String,String>>();
29     }
30     
31     //当的读取到一个开始元素时触发该事件
32     @Override
33     public void startElement(String uri, String localName, String qName,
34             Attributes attributes) throws SAXException {
35         if(qName.equals(localName)){
36             map = new HashMap<String, String>();
37             if(attributes!=null && map!=null){
38                 for(int i=0;i<attributes.getLength();i++){
39                     map.put(attributes.getQName(i), attributes.getValue(i));
40                 }
41             }
42         }
43         currentTag = qName;
44     }
45     //当获取元素的值时候触发调用
46     @Override
47     public void characters(char[] ch, int start, int length)
48             throws SAXException {
49         if(currentTag!=null && map!=null){
50             currentValue = new String(ch, start, length);
51             if(currentValue!=null && !currentValue.trim().equals("") && !currentValue.trim().equals("\n")){
52                 map.put(currentTag, currentValue);
53             }
54         }
55         //获取完毕重置值
56         currentTag = null;
57         currentValue = null;
58     }
59     //遇到结束标记的时候调用这个方法
60     @Override
61     public void endElement(String uri, String localName, String qName)
62             throws SAXException {
63         if(qName.equals(nodeName)){
64             list.add(map);
65             map = null;
66         }
67     }
68 
69 }

SaxService.java

 1 package com.sax.service;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.HashMap;
 6 import java.util.List;
 7 import java.util.Map;
 8 
 9 import javax.xml.parsers.ParserConfigurationException;
10 import javax.xml.parsers.SAXParser;
11 import javax.xml.parsers.SAXParserFactory;
12 
13 import org.xml.sax.SAXException;
14 
15 import com.sax.handler.MyHandler;
16 
17 public class SaxService {
18     
19     public SaxService() {
20     }
21     
22     public static List<HashMap<String,String>> readXml(InputStream inputStream,String nodeName){
23         //创建一个解析XML工厂对象
24         SAXParserFactory spf = SAXParserFactory.newInstance();
25         MyHandler myHandler = new MyHandler(nodeName);
26         try {
27             SAXParser parser = spf.newSAXParser();
28             parser.parse(inputStream, myHandler);
29             inputStream.close();
30             
31         } catch (ParserConfigurationException e) {
32             e.printStackTrace();
33         } catch (SAXException e) {
34             e.printStackTrace();
35         } catch (IOException e) {
36             e.printStackTrace();
37         }
38         return myHandler.getList();
39     }
40     
41 }

HttpUtils.java

 1 package com.sax.http;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.net.HttpURLConnection;
 6 import java.net.MalformedURLException;
 7 import java.net.URL;
 8 
 9 public class HttpUtils {
10 
11     public HttpUtils() {
12     }
13     
14     public static InputStream getXML(String path){
15         InputStream inputStream = null;
16         try {
17             URL url = new URL(path);
18             HttpURLConnection conn = (HttpURLConnection)url.openConnection();
19             conn.setConnectTimeout(3000);
20             conn.setRequestMethod("GET");
21             int code = conn.getResponseCode();
22             if(code == 200){
23                 inputStream = conn.getInputStream();
24             }
25         } catch (MalformedURLException e) {
26             e.printStackTrace();
27         } catch (IOException e) {
28             e.printStackTrace();
29         }
30         return inputStream;
31     }
32 }

Test.java

 1 package com.sax.test;
 2 
 3 import java.io.InputStream;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 import com.sax.http.HttpUtils;
 8 import com.sax.service.SaxService;
 9 
10 public class Test {
11 
12     public Test() {
13         super();
14     }
15 
16     /**
17      * @param args
18      */
19     public static void main(String[] args) {
20         String path = "http://192.168.56.1:8099/web/person.xml";
21         InputStream inputStream = HttpUtils.getXML(path);
22         List<HashMap<String,String>> list = SaxService.readXml(inputStream, "person");
23         for(HashMap map:list){
24             System.out.println(map.toString());
25         }
26     }
27 
28 }

参考自:http://blog.csdn.net/wulianghuan/article/details/8613101

posted @ 2015-02-05 16:18  Summers  阅读(260)  评论(0编辑  收藏  举报