加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Android解析XML办法

发布时间:2021-11-21 20:25:18 所属栏目:教程 来源:互联网
导读:Android解析XML三种方式: 1、DOM (org.w3c.dom)文档对象模型方式,解析完的XML将生成一个树状结构的对象。 2、SAX (org.xml.sax) simpleAPI for XML,以事件的形式通知程序,对XML进行解析。 3、PULL (org.xmlpull.v1) 类似SAX方式,程序以拉取的方式对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
 
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,由于太简单不再给出代码。

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读