由于刚学Android,用的开发工具是Android studio,没用过eclipse的那个开发Android,所以针对有些说由于2个IDE的路径不通导致的文件读取不到,不做分析(实际上是没法分析eclipse里的),这个博文只针对AS用户。

我们的资源文件,除了放到res目录下之外,还可以放在跟java 、res同级的asserts(新建的)目录里。


今天要解析的这个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而不往下执行,导致死循环。

InputStreaminputStream=getAssets().open("getWeatherbyCityName.xml");//InputStreaminputStream=getClass().getClassLoader().getResourceAsStream("assets/"+"getWeatherbyCityName.xml");XmlPullParserxmlPullParser=Xml.newPullParser();xmlPullParser.setInput(inputStream,"utf-8");List<String>infosList=newArrayList<String>();inteventType=xmlPullParser.getEventType();while(eventType!=XmlPullParser.END_DOCUMENT){if("string".equals(xmlPullParser.getName())){Stringinfo=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方法

packagecom.yuanlp.pulldemo2;importandroid.os.Bundle;importandroid.support.v7.app.AppCompatActivity;importandroid.util.Xml;importcom.yuanlp.pulldemo2.bean.StudentBean;importorg.xmlpull.v1.XmlPullParser;importjava.io.InputStream;importjava.util.ArrayList;importjava.util.List;publicclassMainActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);List<StudentBean>list=click();for(StudentBeanstudent:list){System.out.println("+++++++++<><>>>>>>>>>>>id是>>>>>>>>>>>>>>>>>>>>>>>>"+student.getId());System.out.println("+++++++++<><>>>>>>>>>>>年龄是>>>>>>>>>>>>>>>>>>>>>>>>"+student.getAge());System.out.println("+++++++++<><>>>>>>>>>>>名字是>>>>>>>>>>>>>>>>>>>>>>>>"+student.getName());}}publicList<StudentBean>click(){try{InputStreaminputStream=getAssets().open("info2.xml");XmlPullParserxmlPullParser=Xml.newPullParser();xmlPullParser.setInput(inputStream,"utf-8");StudentBeanstudent=null;List<StudentBean>studentlist=null;inteventType=xmlPullParser.getEventType();while(eventType!=XmlPullParser.END_DOCUMENT){switch(eventType){caseXmlPullParser.START_DOCUMENT:studentlist=newArrayList<StudentBean>();break;caseXmlPullParser.START_TAG://从这个start节点到下一个end节点,读取到的属性都属于一个student,所以在此声明一个student,并将这个节点取到的数据放入到这个student中//通过getName()判断读到哪里,然后通过nextText()获取值,或者通过getAttributeValue获取属性值StringtagName=xmlPullParser.getName();if(tagName.equalsIgnoreCase("person")){student=newStudentBean();student.setId(xmlPullParser.getAttributeValue(null,"id"));}elseif(student!=null){if(tagName.equalsIgnoreCase("name")){student.setName(xmlPullParser.nextText());}elseif(tagName.equalsIgnoreCase("age")){student.setAge(xmlPullParser.nextText());}}break;caseXmlPullParser.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();returnstudentlist;}catch(Exceptione){e.printStackTrace();}returnnull;}}


附件:http://down.51cto.com/data/2366759