通常的文件等等都是以xml形式存储的,当我们要查看时就必须将他们解析出来。通常有nSimple API for XML(SAX) ;nDocument Object Model(DOM)(不建议使用) ;nAndroid附带的pull解析器解析XML文件这三种方法。
这里用SAX解析技术做简单介绍:
l
它是一种
解析速度快并且占内存少
的xml解析器,非常适合用于Android等移动设备。
l
SAX解析XML文件采用的是
事件驱动
,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否符合XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些方法,这些方法定义在ContentHandler接口。
以下是一个小例子:
首先,将xml文件考进程序中(或直接导入网上某一段,下一篇再作介绍)。
建一个存放xml文件的包,在包里写入:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>zhangsan</name>
<age>30</age>
</person>
<person id="20">
<name>zhangxiaoxiao</name>
<age>25</age>
</person>
</persons>
这个xml文件。
还要写一个实体类,用来描述xml里的元素。可以存在新建的包里。
public class Person {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
下面就要写方法,将文件注入并解析,SAXService:
public class SAXService {
// 把要解析的数据以输入流的方式传进来
public List<Person> getPersons(InputStream istream) throws Throwable {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();// 单例设计模式
SAXParser saxParser = saxParserFactory.newSAXParser();
PersonHandler personHandler = new PersonHandler();
saxParser.parse(istream, personHandler);
// 当解析过程中遇到符合XML语法规定的语句时就会调用第2个参数所规定的方法
return personHandler.getPersons();
}
private final class PersonHandler extends DefaultHandler {
private List<Person> persons;
private Person person;
private String TAG;
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
if (TAG != null) {
String data = new String(ch, start, length);
if ("name".equals(TAG)) {
person.setName(data);
} else if ("age".equals(TAG)) {
person.setAge(new Integer(data));
}
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if ("person".equals(localName)) {
persons.add(person);
person = null;
}
TAG = null;// 一旦结束就置为空
}
// 进行一些初始化工作
@Override
public void startDocument() throws SAXException {
super.startDocument();
persons = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if ("person".equals(localName)) {
person = new Person();
person.setId(new Integer(attributes.getValue(0)));
}
TAG = localName;
}
public List<Person> getPersons() {
return persons;
}
}
}
除此之外还需要测试类:
public class SAXServiceTest extends AndroidTestCase{
public void textSAX()throws Throwable{
SAXService saxService=new SAXService();
InputStream istream=getClass().getClassLoader().getResourceAsStream("w3/dyp/xml/persons.xml");
List<Person> persons=saxService.getPersons(istream);
for(Person person:persons){
System.out.println(person);
}
}
}
在写测试类之前别忘了要在AndroidManifest.xml里添加代码(如下图划线部分),之前说过的:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="w3.dyp.sax01"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="android.test.runner" />
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="w3.dyp.sax01" >
</instrumentation>
</manifest>
所有的步骤完成后,要对测试类进行测试:
右击textSAX(),如图:
注意在测试前要打开虚拟机,否则不能测试。
当显示绿色条时则程序无错误,如果红色则出错。如图,绿条,无错。