Android --- 使用SAX读取xml文件

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中添加一个按钮,btnidsaxBtn

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);

}

}

最后运行的结果为:

Android --- 使用SAX读取xml文件

你可能感兴趣的:(android)