Android数据存储之XmlPull解析XML文件(读取部分)

由于DOM解析xml文档需要将整个xml DOM树读入,当文件很大时,这种解析效率很低,而Android自带有一个事件触发型的xml解析器XmlPullParser,与SAX解析方式比较相似,区别在于XmlPullParser允许主动从解析器获取事件,满足条件后结束解析。

 

首先写XmlPullUtil类(用途:操作解析器),成员变量与构造方法:

public class XmlPullUtil {
    // 准备XmlUllParser需要的InputStream
    private InputStream inputStream = null;
    private XmlPullParserFactory xppFac = null;
    private XmlPullParser xpp = null;
    
    public XmlPullUtil(InputStream inputStream) {
        this.inputStream = inputStream;
    }

 

其中的getAllPerson()方法实现解析文档,返回一个欲解析节点的对象列表;

View Code
    public List<Person> getAllPerson() throws XmlPullParserException, IOException {
        // 准备好Person列表与Person对象引用(在xml文件中为Person节点)
        List<Person> persons = null;
        Person person = null;
        String elementName = null; // 节点名
        
            // 实例化XmlPullParserFactory与XmlPullParser
            xppFac = XmlPullParserFactory.newInstance();
            xpp = xppFac.newPullParser();
            xpp.setInput(inputStream, "UTF-8");
            
            /* 
               XmlPullParser在解析过程中会返回一个表示状态的int类型,
               由我们自己判断状态然后进行操作, 接着使用next方法移到
               下一个位置继续判断
            */
            int eventType = xpp.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_DOCUMENT) {
                    // 文档开始处,实例化Person列表
                    persons = new ArrayList<Person>();
                } else if (eventType == XmlPullParser.START_TAG) {
                    // 标签开始处,获得标签名
                    elementName = xpp.getName();
                    // 判断标签是不是Person,若是,实例化一个新Person
                    if ("person".equals(elementName)) {
                        person = new Person();
                    }
                } else if (eventType == XmlPullParser.TEXT) {
                    if ("id".equals(elementName)) {
                        person.setId(xpp.getText());
                    } else if ("name".equals(elementName)) {
                        person.setName(xpp.getText());
                    }
                } else if (eventType == XmlPullParser.END_TAG) {
                    elementName = xpp.getName();
                    // 判断结束标签是不是Person,若是, 将person加入列表
                    if ("person".equals(elementName)) {
                        persons.add(person);
                        person = null;
                    }
                }
                eventType = xpp.next();
            }
        return persons;
    }
    
}

 

然后在主Activity中就很简单了:

View Code
public class MainActivity extends Activity {
    
    private TextView idInfoText = null;
    private TextView nameInfoText = null;
    private Button readXmlBtn = null;
    
    private File file = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        idInfoText = (TextView) findViewById(R.id.idInfoText);
        nameInfoText = (TextView) findViewById(R.id.nameInfoText);
        readXmlBtn = (Button) findViewById(R.id.readXmlBtn);
        
        readXmlBtn.setOnClickListener(new ReadXmlBtn());
        
    }
    
    private class ReadXmlBtn implements OnClickListener {

        @Override
        public void onClick(View v) {
            // 首先调用检测储存环境的方法
            if(!MainActivity.this.CheckEnvironment()) {
                return;
            } else {
                try {
                    // 实例化XmlPullUtil类
                    XmlPullUtil xpu = new XmlPullUtil(new FileInputStream(file));
                    // 获取persons列表
                    List<Person> persons = xpu.getAllPerson();
                    // 显示结果
                    MainActivity.this.idInfoText.setText(persons.get(0).getId());
                    MainActivity.this.nameInfoText.setText(persons.get(0).getName());
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                
            }
        }
        
    }
    
    /* 检测储存环境是否配置正常,并设置文件存放路径 */
    private boolean CheckEnvironment() {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            file = new File(Environment.getExternalStorageDirectory().toString() + File.separator + "documents"
                    + File.separator + "shuai.xml");
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            return true;
        } else {
            return false;
        }
    }
    
}

 

 

posted @ 2013-05-09 12:50  来杯冰镇魔卡  阅读(308)  评论(0编辑  收藏  举报