Android学习第十四天----SAX解析xml

SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。

在res资源目录下创建一个叫做raw的文件夹,在文件夹中创建如下的xml文件

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id='1'>
        <name>小王</name>
        <age>19</age>
        <sex></sex>
    </person>
    <person id='2'>
        <name>王子</name>
        <age>29</age>
        <sex></sex>
    </person>
    <person id='3'>
        <name>小张</name>
        <age>27</age>
        <sex></sex>
    </person>
    
</persons>

创建该xml对应的实体类,

package com.example.entity;

public class Persons
{
    private Integer id;
    private String name;
    private String age;
    private String sex;
    public Persons()
    {
        
    }
    public Persons(Integer id, String name, String age, String sex)
    {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    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 String getAge()
    {
        return age;
    }
    public void setAge(String age)
    {
        this.age = age;
    }
    public String getSex()
    {
        return sex;
    }
    public void setSex(String sex)
    {
        this.sex = sex;
    }
}
package com.example.entity;

public class Persons
{
    private Integer id;
    private String name;
    private String age;
    private String sex;
    public Persons()
    {
        
    }
    public Persons(Integer id, String name, String age, String sex)
    {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    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 String getAge()
    {
        return age;
    }
    public void setAge(String age)
    {
        this.age = age;
    }
    public String getSex()
    {
        return sex;
    }
    public void setSex(String sex)
    {
        this.sex = sex;
    }
}

MVC思想中创建c这一层,也就是控制层,

package com.example.oper;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.example.entity.Persons;

public class SaxPar
{
    private List<Persons> list;
    private String flag;
    public List<Persons> parer(InputStream is) throws Exception
    {
        //生成该类的对象
        MyDefaultHandler myDefaultHandler = new MyDefaultHandler();
        //这个方法跟dom有点类似,都是要创建一个工厂,然后实例化
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        SAXParser saxParser = saxParserFactory.newSAXParser();
        //将is流读进来进行操作
        saxParser.parse(is, myDefaultHandler);
        
        return myDefaultHandler.getList();
    }
    
    private class MyDefaultHandler extends DefaultHandler
    {
        private List<Persons> list;
        private Persons p;

        public List<Persons> getList()
        {
            return list;
        }
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException
        {
            if(flag != null)
            {
                if(flag.equals("name"))
                {
                    p.setName(new String(ch,start,length));
                }
                if(flag.equals("sex"))
                {
                    p.setSex(new String(ch,start,length));
                }                
                if(flag.equals("age"))
                {
                    p.setAge(new String(ch,start,length));
                }                
            }
        }
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException
        {
            if(localName.equals("person"))
            {
                list.add(p);
            }
            flag = null;
        }

        @Override
        public void startDocument() throws SAXException
        {
            
            list = new ArrayList<Persons>();
        }

        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException
        {
            
            if(localName.equals("person"))
            {
                p = new Persons();
                p.setId(Integer.parseInt(attributes.getValue(0)));
            }
            flag = localName;
        }
        
    }
}

在activity中应用

package com.example.sax;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.example.entity.Persons;
import com.example.oper.SaxPar;

public class MainActivity extends Activity
{
    private List<Persons> list;
    private ListView mListView;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mListView = (ListView)findViewById(R.id.listView1);
        List<String> mData = new ArrayList<String>();
        
        InputStream is =getResources().openRawResource(R.raw.persons);
        try
        {
            List<Persons> list = new SaxPar().parer(is);
            for (Persons person : list)
            {
                mData.add(person.getId()+"-"+person.getName()+"-"+person.getSex()+"-"+person.getAge());
            }
            
        } catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
        mListView.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,mData));
        
    }
}

 

posted @ 2013-03-22 01:01  小三小山  阅读(145)  评论(0编辑  收藏  举报