转:XML的Pull解析详细实例(Android Studio下)

首先,介绍一下本文背景。是在看第一行代码中的pull解析方式要下新软件,就懒得下,去网上找资料,但是发现很多博客都没有写完一个例子,没想到花了更多的时间。最后找到一篇完整的博客,自己加上一些批注,在这里记录一下

Pull步骤简单介绍

需要建立一个解析器对象XmlPullParser。
再使用XmlPullParser.setInput()方法设置解析器的输入。
之后再通过判断事件类型,循环调用next()方法获得解析的数据

工程文件截图

student.xml用于放要读的数据

Student是数组的泛型

ParserByPull是一个方法类,在里面实现读取

代码如下

student.xml

<?xml version="1.0" encoding="utf-8"?>
<students>
    <student id="20110806100">
        <name>小明</name>
        <age>22</age>
        <sex>男</sex>
    </student>
    <student id="20110806101">
        <name>小李</name>
        <age>24</age>
        <sex>男</sex>
    </student>
    <student id="20110806102">
        <name>小丽</name>
        <age>21</age>
        <sex>女</sex>
    </student>
</students>

Student.class

public class Student {
    private String id;
    private String name;
    private int age;
    private String sex;}(get()和set()方法也要,此处省略)

ParserByPull.class

   public class ParserByPULL {
     
        //采用XmlPullParser来解析文件
        public static List<Student> getStudents(InputStream inputStream)throws Throwable{
          List<Student> students=null;
          Student mStudent=null;
     
          //创建XmlPullParser
            XmlPullParser parser= Xml.newPullParser();
            //解析文件输入流
            parser.setInput(inputStream,"UTF-8");
            //得到当前的解析对象
            int eventType=parser.getEventType();
            //当解析工作还没完成时,调用next()方法得到下一个解析事件
            while (eventType!=XmlPullParser.END_DOCUMENT){
                switch (eventType){
                    case XmlPullParser.START_DOCUMENT:
                        //解析开始的时候初始化list
                        students=new ArrayList<>();
                        break;
                    case XmlPullParser.START_TAG:
                        //获得解析器当前指向的元素的名字
                        //当指向元素的名字和id,name,sex这些属性重合时可以返回他们的值
                        String XPPname=parser.getName();
                        if ("student".equals(XPPname)){
                            //通过解析器获取id的元素值,并设置一个新的Student对象的id
                            mStudent=new Student();
                            mStudent.setId(parser.getAttributeValue(0));
                        }
                        if (mStudent!=null)
                        {
                            if("name".equals(XPPname))
                            {
                                //得到当前指向元素的值并赋值给name
                                mStudent.setName(parser.nextText());
                            }
                            if("age".equals(XPPname))
                            {
                                //得到当前指向元素的值并赋值给age
                                mStudent.setAge(new Short(parser.nextText()));
                            }
                            if("sex".equals(XPPname))
                            {
                                //得到当前指向元素的值并赋值给sex
                                mStudent.setSex(parser.nextText());
                            }
                        }
                        break;
                        //出发结束元素事件
                     case XmlPullParser.END_TAG:
                         if("student".equals(parser.getName()))
                         {
                             students.add(mStudent);
                             mStudent = null;
                         }
                         break;
                    default:
                        break;
                }
                eventType = parser.next();
            }
            return students;
        }
     
     
    }

MainActivity.class

 public class MainActivity extends AppCompatActivity {
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            AssetManager asset=getAssets();
            try{
                InputStream inputStream=asset.open("student.xml");
                List<Student> list=ParserByPULL.getStudents(inputStream);
                for (Student stu:list){
                    Log.e("StudentInfo","Person ID: " + stu.getId() + ","
                            + stu.getName() + ", " + stu.getAge() + ", "
                            + stu.getSex());
                }
            }catch (Throwable e){
                e.printStackTrace();
            }
        }
    }

结果截图

参考链接
————————————————
版权声明:本文为CSDN博主「jiye111」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jiye111/article/details/80471715
————————————————
版权声明:本文为CSDN博主「jiye111」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jiye111/article/details/80471715

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值