个人安卓学习笔记---分别利用SAX、DOM和Pull实现对XML文件的解析并进行单元测试

。。首先我们有如下的xml文件,我要对其进行解析

school.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="school.css"?>
<!DOCTYPE schools SYSTEM "schools.dtd">
<schools>

<school level="middle-school">
	<teacher>
		<teacherName>Tom</teacherName>
		<teacherAge>34</teacherAge>
	</teacher>
	<student>
		<studentName>Jack</studentName>
		<studentAge>20</studentAge>
	</student>
	<student>
		<studentName>Mary</studentName>
		<studentAge>20</studentAge>
	</student>
	<student>
		<studentName>John</studentName>
		<studentAge>20</studentAge>
	</student>
</school>

<school level="primary-school">
	<teacher>
		<teacherName>Tom</teacherName>
		<teacherAge>34</teacherAge>
	</teacher>
	<student>
		<studentName>Jack</studentName>
		<studentAge>20</studentAge>
	</student>
	<student>
		<studentName>Mary</studentName>
		<studentAge>20</studentAge>
	</student>
	<student>
		<studentName>Jhon</studentName>
		<studentAge>20</studentAge>
	</student>

</school>

</schools>

我们现在要对其进行解析,首先要分析他的元素组成部分

大家可以看到在根节点school中,含有如下的属性

1.level 2.子节点techer3.子节点student

创建javabean文件

现在我们创建school.java 的bean文件

package song.domain;

import java.util.List;

public class School {
	private String level;
	private Teacher teacher;
	private List<Student> student;
	public School() {
		super();
		// TODO Auto-generated constructor stub
	}
	public School(String level, Teacher teacher, List<Student> student) {
		super();
		this.level = level;
		this.teacher = teacher;
		this.student = student;
	}
	public String getLevel() {
		return level;
	}
	public void setLevel(String level) {
		this.level = level;
	}
	public Teacher getTeacher() {
		return teacher;
	}
	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
	public List<Student> getStudent() {
		return student;
	}
	public void setStudent(List<Student> student) {
		this.student = student;
	}
	@Override
	public String toString() {
		return "Schoool [level=" + level + ", teacher=" + teacher
				+ ", student=" + student + "]";
	}
	
}

我们又可以注意到,子节点techer的属性

1.teacherName2.techerAge

现在我们创建techer.java 的bean文件

package song.domain;

public class Teacher {
	private String teacherName;
	private Integer teacherAge;
	public Teacher() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Teacher(String teacherName, Integer teacherAge) {
		super();
		this.teacherName = teacherName;
		this.teacherAge = teacherAge;
	}
	public String getTeacherName() {
		return teacherName;
	}
	public void setTeacherName(String teacherName) {
		this.teacherName = teacherName;
	}
	public Integer getTeacherAge() {
		return teacherAge;
	}
	public void setTeacherAge(Integer teacherAge) {
		this.teacherAge = teacherAge;
	}
	@Override
	public String toString() {
		return "Teacher [teacherName=" + teacherName + ", teacherAge="
				+ teacherAge + "]";
	}
	
}

子节点student的属性

1.studentName2.studentAge

现在我们创建student的javabean文件

package song.domain;

public class Student {
	private String studentName;
	private Integer studentAge;

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student(String studentName, Integer studentAge) {
		super();
		this.studentName = studentName;
		this.studentAge = studentAge;
	}

	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public Integer getStudentAge() {
		return studentAge;
	}

	public void setStudentAge(Integer studentAge) {
		this.studentAge = studentAge;
	}

	@Override
	public String toString() {
		return "Student [studentName=" + studentName + ", studentAge="
				+ studentAge + "]";
	}

	
}

好了,我们的Javabean文件到这里就完成了。

现在我们要分别使用三种解析方式,对schools.xml文件进行解析

1.使用SAX解析

要使用SAX对文件进行解析,所需步骤

1)创建Handler类,使之继承DefaultHandler

2)让工厂对象创建解析器对象,利用public void parse (InputStream is, DefaultHandler dh)进行解析

SchoolHandler.java

package song.service;

import java.util.ArrayList;
import java.util.List;

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

import song.domain.School;
import song.domain.Student;
import song.domain.Teacher;
import android.util.Log;
//创建Handler,使之遍历xml文件
public class SchoolHandler extends DefaultHandler {

	List<School> schoolList = null;
	List<Teacher> teacherList = null;
	List<Student> studentList = null;
	School school = null;
	Teacher teacher = null;
	Student student = null;
	String elementTag = null;

	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String data = new String(ch, start, length);
		//对teacher进行解析
		if (elementTag != null && teacher != null) {
			if ("teacherName".equals(elementTag)) {
				teacher.setTeacherName(data);
				Log.i("TAG", teacher.toString());
			} else if ("teacherAge".equals(elementTag)) {
				teacher.setTeacherAge(Integer.valueOf(data));
				Log.i("TAG", teacher.toString());
			}
		}
		//对student进行解析
		if (elementTag != null && student != null) {
			if ("studentName".equals(elementTag)) {
				student.setStudentName(data);
			} else if ("studentAge".equals(elementTag)) {		
				student.setStudentAge(Integer.parseInt(data));
				Log.i("TAG",data);
			}
		}
	}

	public void endDocument() throws SAXException {
	}

	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if ("teacher".equals(localName)) {
			Log.i("TAG", teacher.toString());
			teacherList.add(teacher);
			school.setTeacher(teacher);
			teacher = null;
		} else if ("student".equals(localName)) {
			studentList.add(student);
			school.setStudent(studentList);
			student = null;
		} else if ("school".equals(localName)) {
			school.setStudent(studentList);
			schoolList.add(school);
			studentList = null;
			school = null;
		}
		elementTag = null;
	}

	public void startDocument() throws SAXException {
		schoolList = new ArrayList<School>();
		teacherList = new ArrayList<Teacher>();
		studentList = new ArrayList<Student>();
	}

	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if ("school".equals(localName)) {
			school = new School();
			school.setLevel(attributes.getValue(0));
			studentList = new ArrayList<Student>();
			Log.i("TAG", attributes.getValue(0));
		} else if ("teacher".equals(localName)) {
			teacher = new Teacher();
			Log.i("TAG", teacher.toString());
			if (teacher != null) {
				Log.i("TAG", teacher.toString());
			}
		} else if ("student".equals(localName)) {
			student = new Student();
		}
		elementTag = localName;
	}

	public List<School> setSchoollist() {
		return schoolList;
	}
}

SAXSchoolService.java

package song.service;

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

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

import song.domain.School;

/**
 * 利用SAX解析schools.xml文件*/
public class SAXSchoolService {
	public List<School> getSchoolList(InputStream is) throws Exception{
		//得到创建SAX解析器的工厂对象
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//让工厂对象创建解析器对象
		SAXParser parser = factory.newSAXParser();
		
		//创建DefaultHandler对象
		SchoolHandler handler = new SchoolHandler();
		//使用parser的parser(InputStream is,ContentHandler handler)进行解析
		parser.parse(is, handler);
		
		List<School> schoollist = handler.setSchoollist();
		return schoollist;
	}
}

2.使用Dom进行解析

DomSchoolService.java直接解析,此法较为简便

package song.service;

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import song.domain.School;
import song.domain.Student;
import song.domain.Teacher;

public class DomSchoolService {
	public static List<School> getSchoolList(InputStream in) throws Exception{
		List<School> schoolList=new ArrayList<School>();
		
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder builder=factory.newDocumentBuilder();
		Document document=builder.parse(in);
		
		//取得根结点
		Element root=document.getDocumentElement();
		NodeList nodes=root.getElementsByTagName("school");
		for(int i=0;i<nodes.getLength();i++){
			Element schoolElement=(Element) nodes.item(i);
			School school=new School();
			Teacher teacher=new Teacher();
			Student student=new Student();
			List<Student> studentList=new ArrayList<Student>();
			//为school添加level属性
			school.setLevel(schoolElement.getAttribute("level"));
			NodeList chileNodes = schoolElement.getChildNodes();
			// 遍历孩子节点,忽略文本节点,保留并处理元素节点
			for (int j = 0; j < chileNodes.getLength(); j++) {
				Node childNode = chileNodes.item(j);				
				if("teacher".equals(childNode.getNodeName())){
					NodeList teacherNodes=childNode.getChildNodes();
					for(int t=0;t<teacherNodes.getLength();t++){
						Node teacherNode=teacherNodes.item(t);
						if (teacherNode.getNodeType() == Node.ELEMENT_NODE) {
							if("teacherName".equals(teacherNode.getNodeName())){
								teacher.setTeacherName(teacherNode.getFirstChild().getNodeValue());
							}else if("teacherAge".equals(teacherNode.getNodeName())){
								String age=teacherNode.getFirstChild().getNodeValue();
								teacher.setTeacherAge(Integer.parseInt(age));
							}
						}
						school.setTeacher(teacher);
					}
					
				}else if("student".equals(childNode.getNodeName())){
					NodeList studentNodes=childNode.getChildNodes();
					student=new Student();
					for(int s=0;s<studentNodes.getLength();s++){
						//System.out.println(s);
						Node studentNode=studentNodes.item(s);
						if(studentNode.getNodeType()==Node.ELEMENT_NODE){
							if("studentName".equals(studentNode.getNodeName())){
								student.setStudentName(studentNode.getFirstChild().getNodeValue());								
							}else if("studentAge".equals(studentNode.getNodeName())){
								String age=studentNode.getFirstChild().getNodeValue();
								student.setStudentAge(Integer.parseInt(age));	
								//Log.i("TAG",student.toString());
								studentList.add(student);
								student=null;
							}
						}
					}					
				}
				
			}
			school.setStudent(studentList);
			studentList=null;
			schoolList.add(school);
		}
		return schoolList;		
	}
}


3.使用pull解析xml文件,并且写入xml文件

package song.service;

import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import song.domain.School;
import song.domain.Student;
import song.domain.Teacher;
import android.util.Xml;

public class PullSchoolService {
	public static List<School> getSchoolList(InputStream in) throws Exception{
		List<School> schoolList=null;
		XmlPullParser parser=Xml.newPullParser();
		parser.setInput(in,"utf-8");
		School school=null;
		Teacher teacher=null;
		Student student=null;
		List<Student> studentList=null;
		int eventType=parser.getEventType();
		while(eventType!=XmlPullParser.END_DOCUMENT){
			switch(eventType){
			case XmlPullParser.START_DOCUMENT:
				schoolList=new ArrayList<School>();
				break;
			case XmlPullParser.START_TAG:
				if("school".equals(parser.getName())){
					school=new School();
					school.setLevel(parser.getAttributeValue(0));
					studentList=new ArrayList<Student>();
				}else if("teacherName".equals(parser.getName())){
					teacher=new Teacher();
					teacher.setTeacherName(parser.nextText());
				}else if("teacherAge".equals(parser.getName())){
					teacher.setTeacherAge(Integer.parseInt(parser.nextText()));
				}else if("studentName".equals(parser.getName())){
					student=new Student();
					student.setStudentName(parser.nextText());
				}else if("studentAge".equals(parser.getName())){
					student.setStudentAge(Integer.parseInt(parser.nextText()));
				}
				break;
			case XmlPullParser.END_TAG:
				if("teacher".equals(parser.getName())&&teacher!=null){
					school.setTeacher(teacher);
					teacher=null;
				}else if("student".equals(parser.getName())&&student!=null){
					studentList.add(student);
					student=null;
				}else if("school".equals(parser.getName())&&school!=null){
					school.setStudent(studentList);
					schoolList.add(school);
					school=null;
					studentList=null;
				}
				break;
			}
			// next方法的导致进行下一个节点的解析,同时返回下一个节点解析的事件类型代码、
			eventType = parser.next();
		}
		return schoolList;
	}
	public static void writerPersonList(List<School> schoolList,Writer writer) throws Exception{
		XmlSerializer serializer=Xml.newSerializer();
		serializer.setOutput(writer);
		//定入
		serializer.startDocument("utf-8", true);
		//写入根标签的起始
		serializer.startTag(null, "schools");
		
		for(School school:schoolList){
			serializer.startTag(null, "school");
			//添加id属性
			serializer.attribute(null, "level", school.getLevel());
			serializer.startTag(null, "teacher");
			//老师姓名
			serializer.startTag(null, "teacherName");
			serializer.text(school.getTeacher().getTeacherName());			
			serializer.endTag(null, "teacherName");
			//老师年龄
			serializer.startTag(null, "teacherAge");
			serializer.text(school.getTeacher().getTeacherAge()+"");
			serializer.endTag(null, "teacherAge");	
			serializer.endTag(null, "teacher");
			
			for(Student list:school.getStudent()){
				serializer.startTag(null, "student");
				//学生姓名
				serializer.startTag(null, "studentName");
				serializer.text(list.getStudentName());			
				serializer.endTag(null, "studentName");
				//学生年龄
				serializer.startTag(null, "studentAge");
				serializer.text(list.getStudentAge()+"");
				serializer.endTag(null, "studentAge");	
				serializer.endTag(null, "student");
			}
			serializer.endTag(null, "school");
		}		
		//结束标签
		serializer.endTag(null, "schools");
		//结束文档的写入
		serializer.endDocument();
		
		writer.flush();
		writer.close();
	}
}

3种解析方法都已完成,下面我们来写单元测试

在song.activity中新建一个test类

package song.activity;

import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import song.domain.School;
import song.domain.Student;
import song.domain.Teacher;
import song.service.DomSchoolService;
import song.service.PullSchoolService;
import song.service.SAXSchoolService;
import android.test.AndroidTestCase;
import android.util.Log;

public class Test extends AndroidTestCase{
	public void testSAX() throws Exception {
		List<School> schoolList = null;
		SAXSchoolService service = new SAXSchoolService();
		InputStream is = this.getClass().getClassLoader().getResourceAsStream("schools.xml");
		schoolList = service.getSchoolList(is);
		for(int i = 0;i<schoolList.size();i++){
			Log.i("TAG", schoolList.get(i).toString());
		}
		Log.i("TAG", schoolList.toString());
	}
	public void testDOM() throws Exception{  
        List<School> schoolList=null;  
        InputStream in=this.getClass().getClassLoader().getResourceAsStream("schools.xml");  
        schoolList=DomSchoolService.getSchoolList(in);  
        for(School list:schoolList){  
            Log.i("TAG",list.toString());  
            Log.i("TAG",list.getStudent().toString());  
              
        }  
    }  
      
    public void pullTest() throws Exception{  
        InputStream in=this.getClass().getClassLoader().getResourceAsStream("schools.xml");  
        List<School> schoolList=PullSchoolService.getSchoolList(in);  
        for(School list:schoolList){  
            //Log.i("TAG",List.toString());  
            Log.i("TAG",list.getStudent().toString());  
        }  
          
    }  
    public void pullsave() throws Throwable{  
        List<School> schoolList=new ArrayList<School>();  
        School school=new School();  
        Teacher teacher=new Teacher();  
        List<Student> studentList=new ArrayList<Student>();  
          
        teacher.setTeacherName("Mary");  
        teacher.setTeacherAge(20);  
        studentList.add(new Student("Tom",20));  
        studentList.add(new Student("Jack",22));  
        studentList.add(new Student("Jimjarry",21));  
          
        school.setTeacher(teacher);  
        school.setStudent(studentList);  
        school.setLevel("middle-school");  
          
        schoolList.add(school);  
        schoolList.add(new School("primary-school",new Teacher("renhaili",20),studentList));  
          
        File file=new File(this.getContext().getFilesDir(),"new_student.xml");  
        Writer writer=new FileWriter(file);  
        PullSchoolService.writerPersonList(schoolList, writer);  
    }   
      
}  
	

当写到此时测试类就写完了,但是要注意我们还要在AndroidManifest.xmlAndroidManifest.xml中添加uses-library和test的声明

<uses-sdk android:minSdkVersion="10" />
    <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="song.activity"></instrumentation>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner"/>
    </application>
好了,运行一下,测试类均可以通过


特别提醒:此程序如果不会刷机或者对安卓不熟悉的童鞋请不要在真机上测试,

因为本人在真机上测试的结果是手机黑屏(不是完全不能用,只能查看关机项内容和最近启动程序,无法切换到其他),关机后手机无法启动,结果本人果断的刷机了,如果有想尝试的童鞋,请提前做好备份,准备好刷机包


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值