Android之PULL解析XML

本文介绍了一种基于Android平台的XML文件解析与序列化的具体实现方法,包括自定义类Beauty与接口IBeautyParser的设计,以及实现类BeautyParserImpl的详细代码。此外,还展示了如何在Activity中加载XML文件并显示解析结果。

(1)首先我们放一个文件名为beauties.xml的XML文件到assets目录下,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>    
<beauties>    
    <beauty>    
        <name>范冰冰</name>    
        <age>28</age>    
    </beauty>    
    <beauty>    
        <name>杨幂</name>    
        <age>23</age>    
    </beauty>    

</beauties

然后在src目录下写一个与XML中节点(Node)相对应的类Beauty,其内容如下:

    package com.pulltest;  

    public class Beauty {  

        //美女姓名  
        private String name;  
        //美女年龄  
        private String age;  

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

        @Override  
        public String toString() {  
            return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";  
        }  
    }  

在src目录下写一个接口IBeautyParser,其内容如下:

    package com.pulltest;  

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

    public interface IBeautyParser {  
        /** 
         *  
         * 解析输入流,获取Beauty列表 
         * @param is 
         * @return 
         * @throws Exception 
         */  
        public List<Beauty> parse(InputStream is) throws Exception;  

        /** 
         *  
         * 序列化Beauty对象集合,得到XML形式的字符串 
         * @param beauties 
         * @return 
         * @throws Exception 
         */  
        public String serialize(List<Beauty> beauties) throws Exception;  


    }  

在src目录下写一个上面接口的实现类BeautyParserImpl,其内容如下,代码已经详细注释:

    package com.pulltest;  

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

    import org.xmlpull.v1.XmlPullParser;  

    import android.util.Xml;  

    public class BeautyParserImpl implements IBeautyParser{  

        @Override  
        public List<Beauty> parse(InputStream is) throws Exception {  
            List<Beauty> mList = null;  
            Beauty beauty = null;  

            // 由android.util.Xml创建一个XmlPullParser实例  
            XmlPullParser xpp = Xml.newPullParser();  
            // 设置输入流 并指明编码方式  
            xpp.setInput(is,"UTF-8");  
            // 产生第一个事件  
            int eventType = xpp.getEventType();  

            while (eventType != XmlPullParser.END_DOCUMENT){  
                 switch (eventType) {  
                             // 判断当前事件是否为文档开始事件  
                             case XmlPullParser.START_DOCUMENT:  
                                 mList = new ArrayList<Beauty>(); // 初始化books集合  
                                 break;  
                             // 判断当前事件是否为标签元素开始事件  
                             case XmlPullParser.START_TAG:  
                                 if (xpp.getName().equals("beauty")) { // 判断开始标签元素是否是book  
                                     beauty = new Beauty();  
                                 } else if (xpp.getName().equals("name")) {  
                                     eventType = xpp.next();//让解析器指向name属性的值  
                                     // 得到name标签的属性值,并设置beauty的name  
                                     beauty.setName(xpp.getText());  
                                 } else if (xpp.getName().equals("age")) { // 判断开始标签元素是否是book  
                                     eventType = xpp.next();//让解析器指向age属性的值  
                                     // 得到age标签的属性值,并设置beauty的age  
                                     beauty.setAge(xpp.getText());  
                                 }   
                                 break;  

                             // 判断当前事件是否为标签元素结束事件  
                             case XmlPullParser.END_TAG:  
                                 if (xpp.getName().equals("beauty")) { // 判断结束标签元素是否是book  
                                     mList.add(beauty); // 将book添加到books集合  
                                     beauty = null;  
                                 }  
                                 break;  
                             }  
                             // 进入下一个元素并触发相应事件  
                             eventType = xpp.next();  
                         }  
                         return mList;  

            }  


        @Override  
        public String serialize(List<Beauty> beauties) throws Exception {  
            // TODO Auto-generated method stub  
            return null;  
        }  

    }  

在layout目录下新建一个布局文件pulltest.xml,其内容如下:

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:orientation="vertical" >  

        <TextView  
            android:id="@+id/textView"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content" />  

    </LinearLayout>  

在src目录下的Activity内容如下:

    package com.pulltest;  
    import java.io.InputStream;  
    import java.util.List;  

    import android.app.Activity;  
    import android.os.Bundle;  
    import android.widget.TextView;  

    import com.example.pulltest.R;  


    public class PullTestActivity extends Activity{  

        //装载Beauty类型的链表,其内容由XML文件解析得到  
        private List<Beauty> beautyList;  

        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.pulltest);  

            try {  
                //通过assertmanager的open方法获取到beauties.xml文件的输入流  
                InputStream is = this.getAssets().open("beauties.xml");  
                //初始化自定义的实现类BeautyParserImpl  
                BeautyParserImpl pbp = new BeautyParserImpl();  
                //调用pbp的parse()方法,将输入流传进去解析,返回的链表结果赋给beautyList  
                beautyList = pbp.parse(is);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  

            setupViews();  
        }  

        /** 
         * 将数据显示到手机界面上 
         */  
        private void setupViews(){  
            String result = "";  

            for (Beauty b : beautyList) {    
                result += b.toString();    
            }    

            TextView textView = (TextView) findViewById(R.id.textView);    
            textView.setText(result);   
        }  

    }  

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值