android使用sax解析xml

新建一個類繼承DefaultHandler

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 MyHandler2 extends DefaultHandler {
	private String currentTag=null;
	private String currentValue=null;
	private String nodeName=null;
	private HashMap<String, String> map=null;
	private List<HashMap<String, String>> list=null;

	public List<HashMap<String, String>> getList() {
		return list;
	}

	public MyHandler2(String nodeName) {
		// TODO Auto-generated constructor stub
		this.nodeName=nodeName;
	}
	
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		list=new ArrayList<HashMap<String,String>>();
	}
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		if (qName!=null && !qName.equals("")&&qName.equals(nodeName)) {
			map=new HashMap<String, String>();
		}
		currentTag=qName;
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		if (map!=null && currentTag!=null ) {
			currentValue=new String(ch, start, length);
			if (currentValue!=null && !currentValue.equals("")
					&&!currentValue.startsWith("\n")) {
				map.put(currentTag, currentValue);
			}
		}
		currentTag=null;
		currentValue=null;
	}
	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		if (qName!=null&&qName.equals(nodeName)) {
			list.add(map);
		}
	}

}

一個HttpUtils2類

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 HttpUtils2 {

	public HttpUtils2() {
		// TODO Auto-generated constructor stub
	}
	public InputStream getXML(String path){
		InputStream inputStream=null;
		URL url;
		try {
			url = new URL(path);
			HttpURLConnection httpUrlConnection=(HttpURLConnection) url.openConnection();
			httpUrlConnection.setConnectTimeout(3000);
			httpUrlConnection.setRequestMethod("GET");
			if (httpUrlConnection.getResponseCode()==200) {
				 inputStream=httpUrlConnection.getInputStream();
				
			}
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return inputStream;
	}

}


一個SaxService2類

package com.sax.service;

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

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

import com.sax.handler.MyHandler2;
import com.sun.org.apache.xerces.internal.parsers.SAXParser;

public class SaxService2 {

	public SaxService2() {
		// TODO Auto-generated constructor stub
	}
	public List<HashMap<String, String>> parseXML(InputStream is,MyHandler2 dh){
		List<HashMap<String, String>> list=null;
		SAXParserFactory factory=SAXParserFactory.newInstance();
		try {
			javax.xml.parsers.SAXParser saxParser=factory.newSAXParser();
			saxParser.parse(is, dh);
			 list=dh.getList();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

}


測試類
package com.sax.test;

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

import com.sax.handler.MyHandler2;
import com.sax.http.HttpUtils2;
import com.sax.service.SaxService2;

public class Test2 {

	public Test2() {
		// TODO Auto-generated constructor stub
	}
	public static void main(String[] args) {
		System.out.println("My test....");
		SaxService2 service=new SaxService2();
		MyHandler2 hd=new MyHandler2("person");
		HttpUtils2 util=new HttpUtils2();
		String path = "http://127.0.0.1:8080/person.xml";
		InputStream inputStream=util.getXML(path);
		List<HashMap<String, String>> list=service.parseXML(inputStream, hd);
		for (HashMap<String, String> hashMap : list) {
			System.out.println(hashMap.toString());
		}
	}
}


把如下xml文件放到tomcat中,就可以就行測試讀取xml文件了

<?xml version="1.0" encoding="GBK"?>
<persons>
	<person>
		<id>23</id>
		<name>張三</name>
		<age>30</age>
	</person>
	<person>
		<id>20</id>
		<name>李四</name>
		<age>25</age>
	</person>
</persons>

使用SAX的優點是:
因爲SAX的優勢是流的方式處理,當遇到一個標籤的時候,並不會記錄下當前所碰到的標籤。
也就是說,startEelment方法中,你所知道的信息,僅僅是當前的簽名的名字和屬性,至於標籤的嵌套結構,上層標籤的名字,是否有子元素與其他結構相關的信息,都是不知道的



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章