Android 使用SAX读取xml文件
一 介绍xml
1. Sax是一个解析速度快并且占用内存少的xml解析器,非常合适用于android等移动设备。
2. Sax解析xml文件采用的是事件驱动,也就是说,它并不需要解析整个文档,在按内容顺序解析文档的过程中,sax会判断当前读取到的字符是否合法xml语法中的某部分,如果符合就触发事件。
3. 触发事件要实现ContentHandler接口,但是一般情况下我们会继承ContentHandler接口下的类,因为如果实现了ContentHandler接口,就要实现这个接口下的所有的方法,ContentHandler接口下的方法有好多是我们不需要的,所以我们继承DefaultHandler类。
二 代码详解:
1.读取的person.xml文件
<?xmlversion="1.0"encoding="UTF-8"?>
<persons>
<personid="23">
<name>李明</name>
<age>30</age>
</person>
<personid="20">
<name>李向梅</name>
<age>25</age>
</person>
</persons>
2.Xml文件映射为javaBean
package cn.csdn.hr.android.domain;
import java.io.Serializable;
publicclass Personimplements Serializable {
privatestaticfinallongserialVersionUID = 1L;
private Integerid;
private Stringname;
private Integerage;
public Person() {
super();
//TODO Auto-generated constructor stub
}
public Person(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
returnid;
}
publicvoid setId(Integer id) {
this.id = id;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
public Integer getAge() {
returnage;
}
publicvoid setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return"Person [id=" +id + ", name=" +name +", age=" +age +"]";
}
}
3.添加按钮
因为在android中没有java的运行环境,我们要想测试,需要通过事件处理来去执行方法,所以我们在main.xml中添加一个按钮,btn的id为saxBtn
4.在activity中我们触发事件,来读取persons.xml
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置视图
setContentView(R.layout.main);
//获取btn安
Button saxBtn = (Button) findViewById(R.id.saxBtn);
saxBtn.setOnClickListener(new OnClickListener() {
publicvoid onClick(View v) {
try {
//解析xml文件,把他转换为输入流
FileInputStream fis =new FileInputStream(new File(
Environment.getExternalStorageDirectory(),"persons.xml"));
SaxXmlTest contentHandler =new SaxXmlTest();
//根据android.util.Xml.parse来触发解析器,采用事件驱动模型触发的
android.util.Xml.parse(fis, Xml.Encoding.UTF_8, contentHandler);
} catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} }
});
}
4. 我们需要用测试类继承类来读取xml文件
package cn.csdn.hr.android.xml;
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 cn.csdn.hr.android.domain.Person;
import android.util.Log;
publicclass SaxXmlTestextends DefaultHandler {
//提供了ContentHanlder接口就要继承接口中所有的方法
//提供了DefaultHandler类实现了这个ContentHander接
private List<Person>persons;
private Personperson;
//创建一个存储解析出的文本内容
private StringBufferbuffer =new StringBuffer();
@Override
publicvoid characters(char[] ch, int start,int length)
throws SAXException {
buffer.append(ch, start, length);
Log.v("BUFFER",buffer.toString());
super.characters(ch, start, length);
}
//解析xml文档时触发的方法
@Override
publicvoid startDocument()throws SAXException {
//TODO Auto-generated method stub
super.startDocument();
//存放解析的数据
persons =new ArrayList<Person>();
//输出
Log.v("STARTDOC","解析文件开始...........................");
}
//解析文档结束
@Override
publicvoid endDocument()throws SAXException {
//TODO Auto-generated method stub
super.endDocument();
for (Person p :persons) {
Log.v("P", p.toString());
}
Log.v("STARTDOC","解析文件结束.........................");
}
@Override
publicvoid endElement(String uri, String localName, String qName)
throws SAXException {
//TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if (localName.equals("person")) {
persons.add(person);
} elseif (localName.equals("name")) {
person.setName(buffer.toString().trim());
//清空缓冲区
buffer.setLength(0);
} elseif (localName.equals("age")) {
person.setAge(Integer.parseInt(buffer.toString().trim()));
buffer.setLength(0);
}
}
@Override
publicvoid startElement(String uri, String localName, String qName,
Attributes attributes)throws SAXException {
//TODO Auto-generated method stub
Log.v("ELEMENT", localName +"====" + qName +"=========" + attributes);
//当解析到person标签的时候实例化person对象
if (localName.equals("person")) {
person =new Person();
//通过attributes得到属性
person.setId(Integer.parseInt(attributes.getValue("id")));
}
super.startElement(uri, localName, qName, attributes);
}
}
最后运行的结果为: