`

Android XML解析——Sax解析XML

阅读更多

 以下文章是从老罗教学中的总结,感谢老罗

 

ØSAX是一种以事件驱动的XML api,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML

   结构,简单的讲,它解析速度快,占用内存少的解析器。这种解析器比较适合android 等移动设备。

 
Ø使用SAX的优点是:
  因为SAX的优势是流的方式处理,当遇到一个标签的时候,并不会记录下当前所碰到的标签。
  也就是说,startEelment方法中,你所知道的信息,仅仅是当前的签名的名字和属性,至于标签的嵌套结
  构,上层标签的名字,是否有子元素与其他结构相关的信息,都是不知道的。
  
  需要解析的XML
  
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="1">
        <name>张三</name>
        <age>20</age>
    </person>
     <person id="2">
        <name>李四</name>
        <age>24</age>
    </person>
</persons>
 
 
package com.sax.handler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.jar.Attributes.Name;

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 = null;// 解析当前的节点名称

	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(nodeName)) {
			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 {
		// 这个方法是用来处理xml文件所读取到的内容
		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;
		}
		super.endElement(uri, localName, qName);
	}
}

 

package com.sax.http;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpUtils {

	public HttpUtils() {
	}

	public static InputStream getXML(String path) {
		InputStream inputStream = null;
		try {
			URL url = new URL(path);
			if (url != null) {
				HttpURLConnection connection = (HttpURLConnection) url
						.openConnection();
				connection.setConnectTimeout(3000);
				connection.setDoInput(true);
				connection.setRequestMethod("GET");
				int code = connection.getResponseCode();
				if (code == 200) {
					inputStream = connection.getInputStream();
				}
			}
		} catch (Exception e) {
		}
		return inputStream;
	}
}

 

package com.sax.service;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import com.sax.handler.MyHandler;

public class SaxService {

	public SaxService() {
	}

	public static List<HashMap<String, String>> readXML(
			InputStream inputStream, String nodeName) {
		try {
			// 创建一个解析xml的工厂对象
			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser parser = spf.newSAXParser();// 解析xml
			MyHandler handler = new MyHandler(nodeName);
			parser.parse(inputStream, handler);
			inputStream.close();
			return handler.getList();
		} catch (Exception e) {
		}
		return null;
	}
}

 

package com.sax.test;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import com.sax.http.HttpUtils;
import com.sax.service.SaxService;

public class Test {

	public Test() {
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String path = "http://192.168.0.102:8080/myhttp/person.xml";
		InputStream inputStream = HttpUtils.getXML(path);
		try {
			List<HashMap<String, String>> list = SaxService.readXML(
					inputStream, "person");
			for (HashMap<String, String> map : list) {
				System.out.println(map.toString());
			}
		} catch (Exception e) {
		}
	}

}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics