Android开发使用SAX读取xml文件

时间: 2012-05-24 / 分类: 开发实例 / 浏览次数: 1,591 views / 5个评论 发表评论

一  介绍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;

    }

[email protected]

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

[email protected]

    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文档时触发的方法

[email protected]

    publicvoid startDocument()throws SAXException {

       //TODO Auto-generated method stub

       super.startDocument();

       //存放解析的数据

       persons =new ArrayList<Person>();

       //输出

       Log.v(“STARTDOC”,”解析文件开始………………………”);

    }

    //解析文档结束

[email protected]

    publicvoid endDocument()throws SAXException {

       //TODO Auto-generated method stub

       super.endDocument();

       for (Person p :persons) {

           Log.v(“P”, p.toString());

       }

       Log.v(“STARTDOC”,”解析文件结束…………………….”);

    }

[email protected]

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

       }

    }

[email protected]

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

    }

}

最后运行的结果为:

转载自http://www.iandroid.cn/bbs/android-8817-1-1.html



.

*******************************************************************

上面是广告! 真的是广告!! 真的真的啊!!!

-----------------------------------------------------Copyright © 2011-2012--浙ICP备12011997---------------------------- ---------------------- ------------------------

无觅相关文章插件,快速提升流量