yaku.xml
<?xml version='1.0' encoding='UTF-8'?>
<persons>
<person id="22">
<name>张定</name>
<age>29</age>
</person>
<person id="23">
<name>罗涛</name>
<age>35</age>
</person>
</persons>
实体类Person.java,主要用来设置获取XML文档中需要的数据
package com.yaku.saxXML;
public class Person {
private int id;
private String name;
private int age;
public Person() {}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
用Sax解析XML的SaxPersonService.java
package com.yaku.saxXML;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxPersonService {
public static List<Person> readXML(InputStream inStream) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parse = factory.newSAXParser();
XMLContentHandler handler = new XMLContentHandler();
parse.parse(inStream, handler);
inStream.close();
return handler.getPerson();
}
@SuppressWarnings("unused")
private static class XMLContentHandler extends DefaultHandler{
private List<Person> person;
private Person ps;
private String flag = null;
/**
* 读取XML文档头部
* @throws SAXException
*/
public void startDocument() throws SAXException {
person = new ArrayList<Person>();
}
/**
* 开始标签
*/
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if("person".equals(localName)){
ps = new Person();
ps.setId(Integer.parseInt(attributes.getValue("id")));
}
flag = localName;
}
/**
* 文本内容
*/
public void characters(char[] ch, int start, int length) throws SAXException {
if(flag!=null){
String date = new String(ch,start,length);
if("name".equals(flag)){
ps.setName(date);
}else if("age".equals(flag)){
ps.setAge(Integer.parseInt(date));
}
}
}
/**
* 结束标签
*/
public void endElement(String uri, String localName, String qName) throws SAXException {
if("name".equals(localName) || "age".equals(localName)){
flag = null;
}
if("person".equals(localName)){
person.add(ps);
ps = null;
}
}
public List<Person> getPerson() {
return person;
}
public void setPerson(List<Person> person) {
this.person = person;
}
}
}
测试类SaxPersonServiceTest.java
package com.yaku.android;
import java.io.InputStream;
import java.util.List;
import com.yaku.saxXML.Person;
import com.yaku.saxXML.SaxPersonService;
import android.test.AndroidTestCase;
public class SaxPersonServiceTest extends AndroidTestCase {
public void testReadXML() throws Exception{
InputStream inStream = SaxPersonService.class.getClassLoader().getResourceAsStream("yaku.xml");
SaxPersonService server = new SaxPersonService();
List<Person> person = server.readXML(inStream);
for(Person ps : person){
System.out.println(ps.toString());
}
}
}
在AndroidManifest.xml文件中配置单元测试环境
在<application>标签下面加入:
<uses-library android:name="android.test.runner" />
在根标签下加入:
<instrumentation android:targetPackage="com.yaku.android"
android:name="android.test.InstrumentationTestRunner"
android:label="Test Unit Tests"></instrumentation>
其中android:targetPackage为测试类所在包名