歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android解析XML方式

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

  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.  

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.      

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.     } 

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.  

這裡訪問的使用自己搭建的web工程下的一個xml,由於太簡單不再給出代碼。

Copyright © Linux教程網 All Rights Reserved