Android解析XML三种方式:
1、DOM (org.w3c.dom)文档对象模型方式,解析完的XML将生成一个树状结构的对象。
2、SAX (org.xml.sax) simpleAPI for XML,以事件的形式通知程序,对XML进行解析。
3、PULL (org.xmlpull.v1) 类似SAX方式,程序以"拉取"的方式对Xml进行解析。
本篇讲解一下SAX解析XML这种方式,首先来看一下它的基本介绍:
SAX是一种以事件驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的讲,它是种解析速度快,占用内存少的解析器。这种解析器比较适合android等移动设备。
使用SAX的优点:
因为SAX的优势是流的处理方式,当遇到一个标签的时候,并不会记录下当前所碰到的标签。也就是说,startElement的方法中,你所知道的信息,仅仅是当前的签名的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元素与其他结构相关的信息,都是不知道的。
我们需要使用DefaultHandler这个类来解析
java.lang.Object org.xml.sax.helpers.DefaultHandler
我们通过一个简单的实例来看一下如何使用SAX解析XML这门技术:
工程目录结构
几个重要java类的源代码:
MyHandler.java
package com.sax.handler; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyHandler extends DefaultHandler{ private HashMap<String,String> map = null; //存储单个解析出来的对象 private List<HashMap<String,String>> list = null; //存储所有解析出来的对象 private String currentTag = null; //正在解析的元素的标签 private String currentValue = null; //当前解析的元素的值 private String nodeName; //当前解析的结点名称 public MyHandler(String nodeName) { this.nodeName = nodeName; } public List<HashMap<String, String>> getList() { return list; } //当读取到第一个开始标签时候触发该事件 @Override public void startDocument() throws SAXException { list = new ArrayList<HashMap<String,String>>(); } //当的读取到一个开始元素时触发该事件 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals(localName)){ map = new HashMap<String, String>(); if(attributes!=null && map!=null){ for(int i=0;i<attributes.getLength();i++){ map.put(attributes.getQName(i), attributes.getValue(i)); } } } currentTag = qName; } //当获取元素的值时候触发调用 @Override public void characters(char[] ch, int start, int length) throws SAXException { if(currentTag!=null && map!=null){ currentValue = new String(ch, start, length); if(currentValue!=null && !currentValue.trim().equals("") && !currentValue.trim().equals("\n")){ map.put(currentTag, currentValue); } } //获取完毕重置值 currentTag = null; currentValue = null; } //遇到结束标记的时候调用这个方法 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals(nodeName)){ list.add(map); map = null; } } }
package com.sax.service; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.sax.handler.MyHandler; public class SaxService { public SaxService() { } public static List<HashMap<String,String>> readXml(InputStream inputStream,String nodeName){ //创建一个解析XML工厂对象 SAXParserFactory spf = SAXParserFactory.newInstance(); MyHandler myHandler = new MyHandler(nodeName); try { SAXParser parser = spf.newSAXParser(); parser.parse(inputStream, myHandler); inputStream.close(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return myHandler.getList(); } }
package com.sax.http; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class HttpUtils { public HttpUtils() { } public static InputStream getXML(String path){ InputStream inputStream = null; try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(3000); conn.setRequestMethod("GET"); int code = conn.getResponseCode(); if(code == 200){ inputStream = conn.getInputStream(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return inputStream; } }
package com.sax.test; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import com.sax.http.HttpUtils; import com.sax.service.SaxService; public class Test { public Test() { super(); } /** * @param args */ public static void main(String[] args) { String path = "http://192.168.56.1:8099/web/person.xml"; InputStream inputStream = HttpUtils.getXML(path); List<HashMap<String,String>> list = SaxService.readXml(inputStream, "person"); for(HashMap map:list){ System.out.println(map.toString()); } } }