zoukankan      html  css  js  c++  java
  • Android 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("
    ")){
    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 
    69 }

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

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

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

    参考自:http://blog.csdn.net/wulianghuan/article/details/8613101

  • 相关阅读:
    2020年秋招联发科小米等20家公司面经总结
    一个普通硕士生的2020秋招总结(文末送福利)
    Linux内核中container_of宏的详细解释
    拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)
    UWB硬件设计相关内容
    SpringToolSuit(STS)添加了Lombok后仍然报错
    Spring Boot整合Mybatis出现错误java.lang.IllegalStateException: Cannot load driver class:com.mysql.cj.jdbc.Driver
    Word快捷选取
    微服务下的用户登录权限校验解决方案
    Spring Boot 使用Mybatis注解开发增删改查
  • 原文地址:https://www.cnblogs.com/summers/p/4275141.html
Copyright © 2011-2022 走看看