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這個類來解析
類 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;
- }
- }
-
- }
SaxService.java
- 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();
- }
-
- }
HttpUtils.java
- 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;
- }
- }
Test.java
- 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());
- }
- }
-
- }
這裡訪問的使用自己搭建的web工程下的一個xml,由於太簡單不再給出代碼。