android XMLPullParser读取xml文件

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述android XMLPullParser读取xml文件相关的知识,希望能为你提供帮助。
                由于刚学android,用的开发工具是Android studio,没用过eclipse的那个开发Android,所以针对有些说由于2个IDE的路径不通导致的文件读取不到,不做分析(实际上是没法分析eclipse里的),这个博文只针对AS用户。
                我们的资源文件,除了放到res目录下之外,还可以放在跟java 、res同级的asserts(新建的)目录里。

android XMLPullParser读取xml文件

文章图片


                今天要解析的这个xml就是在这个目录下的。
首先说一下xmlpullparser,这个pull解析是基于事件的模式。比如
读取到xml的开始声明内容,那么就会触发START_DOCUMENT,返回一个int类型数据;
读取到xml的结束内容,那么触发END_DOCUMENT,返回一个int类型数据
读取到xml的开始标签,返回START_TAG,
读取到xml的结束标签,返回END_TAG,
读取到xml的文本返回TEXT
读取标签后,可以获取该标签的属性值与文本值
下面这个例子讲解的xml在附件中的getWeatherByCityName.xml.

下面开始讲步骤:
1、获取assets里面的资源文件的输入流。  这里在AS中可以通过AssetManager来获取,即第一行代码的方式。也可以通过第二行的方式获取这个输入流
2、声明xmlPullParser并给输入流指明编码方式。
3、定义一个xmlpullParser获取到的事件类型,eventType。
4、开始循环解析,如果没有碰到END_DOCUMENT,那么就一直往下走;取出节点是string的tag里的文本内容并放入到list里,作为后面处理。
5、一定要注意,要加上eventType=xmlPullParser.next(); 不然的话循环会一直读取xml的第一个节点,即START_DOCUMENT而不往下执行,导致死循环。

  InputStream  inputStream  =  getAssets().open("getWeatherbyCityName.xml"); //  InputStream  inputStream  =  getClass().getClassLoader().getResourceAsStream("assets/"+"getWeatherbyCityName.xml");   XmlPullParser  xmlPullParser  =  Xml.newPullParser();   xmlPullParser.setInput(inputStream,"utf-8");   List< String>   infosList=new  ArrayList< String> ();   int  eventType=xmlPullParser.getEventType();   while(eventType!=XmlPullParser.END_DOCUMENT){           if  ("string".equals(xmlPullParser.getName())){                   String  info=xmlPullParser.nextText();                   infosList.add(info);           }           eventType=xmlPullParser.next();   }

下面讲一个比较常见的xml格式的文件读取里面的内容:
这个xml对应的xml是附件中的info2.xml


                需要注意的是xml文件的格式正确。之前由于从网上拷贝了一个xml文本内容,结果xml莫名的各种红线,调试下面的程序时,报xml格式错误,就手写了一个xml,编译器不报错了,才调试好。



                里面讲解的StudentBean 只是一个简单的有3个私有属性的类,id,name,age,带上get/set方法
package  com.yuanlp.pulldemo2; import  android.os.Bundle; import  android.support.v7.app.AppCompatActivity; import  android.util.Xml; import  com.yuanlp.pulldemo2.bean.StudentBean; import  org.xmlpull.v1.XmlPullParser; import  java.io.InputStream; import  java.util.ArrayList; import  java.util.List; public  class  MainActivity  extends  AppCompatActivity  {        @Override         protected  void  onCreate(Bundle  savedInstanceState)  {                 super.onCreate(savedInstanceState);                 setContentView(R.layout.activity_main);               List< StudentBean>   list=click();               for(StudentBean  student  :  list){                       System.out.println("+++++++++< > < > > > > > > > > > > > id是> > > > > > > > > > > > > > > > > > > > > > > > "+student.getId());                       System.out.println("+++++++++< > < > > > > > > > > > > > 年龄是> > > > > > > > > > > > > > > > > > > > > > > > "+student.getAge());                       System.out.println("+++++++++< > < > > > > > > > > > > > 名字是> > > > > > > > > > > > > > > > > > > > > > > > "+student.getName());               }         }        public  List< StudentBean>   click(){                 try  {                         InputStream  inputStream=getAssets().open("info2.xml");                         XmlPullParser  xmlPullParser=  Xml.newPullParser();                         xmlPullParser.setInput(inputStream,"utf-8");                         StudentBean  student=null;                         List< StudentBean>   studentlist=null;                         int  eventType=xmlPullParser.getEventType();                         while(eventType!=XmlPullParser.END_DOCUMENT){                                switch  (eventType){                                         case  XmlPullParser.START_DOCUMENT:                                                 studentlist=new  ArrayList< StudentBean> ();                                                 break;                                         case  XmlPullParser.START_TAG:                                                 //从这个start节点到下一个end节点,读取到的属性都属于一个student,所以在此声明一个student,并将这个节点取到的数据放入到这个student中                                                 //通过getName()判断读到哪里,然后通过nextText()获取值,或者通过getAttributeValue获取属性值                                                 String  tagName=xmlPullParser.getName();                                                 if  (tagName.equalsIgnoreCase("person")){                                                         student=new  StudentBean();                                                         student.setId(xmlPullParser.getAttributeValue(null,"id"));                                                 }else  if  (student!=null){                                                         if  (tagName.equalsIgnoreCase("name")){                                                                 student.setName(xmlPullParser.nextText());                                                         }else  if  (tagName.equalsIgnoreCase("age")){                                                                 student.setAge(xmlPullParser.nextText());                                                         }                                                 }                                                 break;                                         case  XmlPullParser.END_TAG:  //结束标签                                                 //如果读取到结束标签,而且这个结束标签是person的话,就把student放入到list,并把student置null,方便下个循环重新声明                                                 if  (xmlPullParser.getName().equalsIgnoreCase("person")& & student!=null){                                                         //读完一个person,可以将他放入到list中                                                         studentlist.add(student);                                                         student=null;                                                 }                                }                                 eventType=xmlPullParser.next();                         }                             inputStream.close();                         return    studentlist;                 }  catch  (Exception  e)  {                         e.printStackTrace();                 }                 return  null;         } }



【android XMLPullParser读取xml文件】本文出自 “YuanGuShi” 博客,请务必保留此出处http://cm0425.blog.51cto.com/10819451/1939165

    推荐阅读