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