Android解析XML方式(一)使用SAX解析

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值