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,由于太简单不再给出代码。

  • 1
  • 2
  • 3
  • 下一页
【内容导航】
第1页:使用SAX解析 第2页:使用PULL解析XML
第3页:使用DOM解析XML

相关内容

    暂无相关文章