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

来源:互联网 发布:python 模拟鼠标点击 编辑:程序博客网 时间:2024/05/22 11:45

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

    }

}

 

 

最后运行的结果为:

 

原创粉丝点击