歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android解析XML方式

Android解析XML方式

日期:2017/3/1 10:00:42   编辑:Linux編程

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. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import org.xml.sax.Attributes;
  7. import org.xml.sax.SAXException;
  8. import org.xml.sax.helpers.DefaultHandler;
  9. public class MyHandler extends DefaultHandler{
  10. private HashMap<String,String> map = null; //存儲單個解析出來的對象
  11. private List<HashMap<String,String>> list = null; //存儲所有解析出來的對象
  12. private String currentTag = null; //正在解析的元素的標簽
  13. private String currentValue = null; //當前解析的元素的值
  14. private String nodeName; //當前解析的結點名稱
  15. public MyHandler(String nodeName) {
  16. this.nodeName = nodeName;
  17. }
  18. public List<HashMap<String, String>> getList() {
  19. return list;
  20. }
  21. //當讀取到第一個開始標簽時候觸發該事件
  22. @Override
  23. public void startDocument() throws SAXException {
  24. list = new ArrayList<HashMap<String,String>>();
  25. }
  26. //當的讀取到一個開始元素時觸發該事件
  27. @Override
  28. public void startElement(String uri, String localName, String qName,
  29. Attributes attributes) throws SAXException {
  30. if(qName.equals(localName)){
  31. map = new HashMap<String, String>();
  32. if(attributes!=null && map!=null){
  33. for(int i=0;i<attributes.getLength();i++){
  34. map.put(attributes.getQName(i), attributes.getValue(i));
  35. }
  36. }
  37. }
  38. currentTag = qName;
  39. }
  40. //當獲取元素的值時候觸發調用
  41. @Override
  42. public void characters(char[] ch, int start, int length)
  43. throws SAXException {
  44. if(currentTag!=null && map!=null){
  45. currentValue = new String(ch, start, length);
  46. if(currentValue!=null && !currentValue.trim().equals("") && !currentValue.trim().equals("\n")){
  47. map.put(currentTag, currentValue);
  48. }
  49. }
  50. //獲取完畢重置值
  51. currentTag = null;
  52. currentValue = null;
  53. }
  54. //遇到結束標記的時候調用這個方法
  55. @Override
  56. public void endElement(String uri, String localName, String qName)
  57. throws SAXException {
  58. if(qName.equals(nodeName)){
  59. list.add(map);
  60. map = null;
  61. }
  62. }
  63. }

SaxService.java

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

HttpUtils.java

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

Test.java

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

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

Copyright © Linux教程網 All Rights Reserved