android中使用SAX解析xml(封装)

SAX具体怎么用就不说了,网上搜搜 一大片

第一步:建立公共抽象类BaseHandler
package com.dc.handler;

import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;

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

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public abstract class BaseHandler extends DefaultHandler {
	
	//缓存!公共数据的存放类,所有数据都从这里取,一般将它写在Const类中,这里我就不建Const.java了
	public static Map hash=new HashMap();//放在Const.java中!
	
	public abstract boolean parse(String xmlString);
	
	public static void parserXml(BaseHandler baseHandler, String xmlString)
			throws Exception {
		if (xmlString == null || xmlString.length() == 0)
			return;

		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		XMLReader xmlReader = parser.getXMLReader();
		xmlReader.setContentHandler(baseHandler);

		//解析文件
//		xmlReader.parse(new InputSource(new URL("main.xml").openStream()));//文件
		// 创建一个xml字符串
		StringReader read = new StringReader(xmlString);
		// 创建新的输入源SAX 解析器将使用 InputSource对象来确定如何读取 XML 输入
		InputSource source = new InputSource(read);
		xmlReader.parse(source);
		read.close();
	}
	
	public abstract void characters(char[] ch, int start, int length)
			throws SAXException;

	public abstract void endDocument() throws SAXException;

	public abstract void endElement(String uri, String localName, String qName)
			throws SAXException;

	public abstract void startDocument() throws SAXException;

	public abstract void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException;
			
}


第二步:实现类
比如,我们要解析一个xml字符串,该字符串可以来自网络。
<students>
<student sn='001'><id>1</id><name>benny</name><age>20</age></student>
<student sn='002'><id>2</id><name>jimmy</name><age>30</age></student>
</students>
解析它:
package com.dc.handler;

import java.util.HashMap;
import java.util.Stack;
import java.util.Vector;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

import com.dc.model.Student;

//实现类
public class StudentHandler extends BaseHandler {

	private static final String tag="StudentHandler";
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		String chars = new String(ch, start, length).trim();
		if(chars!=null) {
			String tagName = (String)tagStack.peek();//查看栈顶对象而不移除它 
			Student object=students.lastElement();
//			System.out.println("chars="+chars);
			if (tagName.equals("id")) {
				object.setId(chars);
			}else if(tagName.equals("name")){
				object.setName(chars);
			}else if(tagName.equals("age")){
				object.setAge(chars);
			}
		}
	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
//		Consts.hash.put("students", students.lastElement());//一个对象
		 hash.put("students", students);//保存入hash,这里保存的是Vector对象
		 students=null;//没用了就清掉
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		tagStack.pop();//移除栈顶对象并作为此函数的值返回该对象
	}

	@Override
	public boolean parse(String xmlString) {
		// TODO Auto-generated method stub
		try {  
            super.parserXml(this, xmlString);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
	}

	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub

	}
	private Stack<String> tagStack = new Stack<String>();
	private Vector<Student> students = new Vector<Student>(); 
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
//		System.out.println("qName="+qName);
		if(qName.equals("student")){
			Student object=new Student();
			object.setSn(attributes.getValue("sn"));
			students.addElement(object);
		}
		tagStack.push(qName);
	}
	
}

下面是Student的model类:
package com.dc.model;

public class Student {
	
	private String sn;
	private String id;
	private String name;
	private String age;
	public String getSn() {
		return sn;
	}
	public void setSn(String sn) {
		this.sn = sn;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}

}


第三步:TestCase测试
package com.dc.test;

import java.util.Vector;

import junit.framework.TestCase;
import com.dc.handler.BaseHandler;
import com.dc.handler.StudentHandler;
import com.dc.model.Student;

public class TestStudentHandler extends TestCase {
	
	public void test1(){
		String data="<students><student sn='001'><id>1</id><name>benny</name><age>20</age></student><student sn='002'><id>2</id><name>jimmy</name><age>30</age></student></students>";
		BaseHandler handler=new StudentHandler();  
		handler.parse(data);
		
		Vector students=(Vector)BaseHandler.hash.get("students");//hash很重要,所有的东西都在hash中
		
		for(int i=0;i<students.size();i++){
			Student student=(Student)students.elementAt(i);
			if(student==null){
				System.out.println("student is null");
			}else{
				System.out.println(student.getSn()+":"+student.getId()+":"+student.getName()+":"+student.getAge());
			}
		}
	}
}

打印出:
001:1:benny:20
002:2:jimmy:30

其实这个解析和j2me中jsr172解析xml基本一样。
请看我在j2me中是怎么解析的:
http://gundumw100.iteye.com/admin/blogs/762763

另:奉送j2me中KXML解析xml
http://gundumw100.iteye.com/admin/blogs/760163

Android数据格式解析对象JSON用法
http://www.cnblogs.com/devinzhang/archive/2012/01/09/2317315.html

你可能感兴趣的:(java,xml,android,JUnit)