Android默认使用内置的Pull解析器来解析xml文件。虽然SAX和DOM解析也能用,推荐使用pull解析。Pull解析类似于SAX解析,都采用事件驱动方式来进行解析。
原理:不断地调用Pull解析器的next方法获取下一个解析事件的类型,根据事件类型
判断是否读取到文件的尾部。当处于某个元素处时,可调用getAttributeValue()方法获
取该元素的属性值,也可调用nextText()获取文本节点的值。调用getName()获取标签名。
步骤:
1.拿到加载资源文件XML的解析器
2.通过解析器获得事件类型
3.根据事件类型判断并获取相应的值
那来做下吧,
1.准备了一个简单的xml文件:
movies.xml:
<?xml version="1.0" encoding="UTF-8"?> <Movies> <Movie id="1"> <name>愤怒的小鸟</name> <type>animation</type> <year>2016</year> </Movie> <Movie id="2"> <name>叶问</name> <type>action</type> <language>chinese</language> </Movie> </Movies>
在res文件下新建了一个文件夹xml:
2.可以看到最外层的节点 Movies 中包含两个 Movie ,而每个 Movie 中又包含三个属性:name 、type 、language
所以我们可以新建一个Movies 类来保存解析出来的每个 Movie , Movie中应该有四个属性 id 、name 、type 、language
Movies.java:
public class Movies { private String id,name,type,language,year; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public String getYear() { return year; } public void setYear(String year) { this.year = year; } @Override public String toString() { // TODO Auto-generated method stub return "id:"+id+","+"name:"+name; } }3.activity_main布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="pull" android:text="pull解析"/> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
4. PULL解析器调用该getEventType()返回事件类型。
XmlPullParser.END_DOCUMENT 文档解析结束
XmlPullParser.START_DOCUMENT 文档开始解析
XmlPullParser.START_TAG 解析到开始标签
public class MainActivity extends Activity { private TextView tv; private List<Movies>movies; private Movies movie; //用pull方式解析xml文件 public void pull(View view){ XmlResourceParser xmlResourceParser=getResources().getXml(R.xml.movies); try { //拿到第一个事件类型 int type=xmlResourceParser.getEventType(); while(type!=XmlResourceParser.END_DOCUMENT){ if(type==XmlResourceParser.START_DOCUMENT){ movies=new ArrayList<Movies>(); } if(type==XmlResourceParser.START_TAG){ if("Movie".equals(xmlResourceParser.getName())){ movie=new Movies(); String id=xmlResourceParser.getAttributeValue(null,"id"); movie.setId(id); System.out.println("id:"+id); } if("name".equals(xmlResourceParser.getName())){ String name=xmlResourceParser.nextText(); movie.setName(name); System.out.println("name:"+name); } } if(type==XmlResourceParser.END_TAG){ if("Movie".equals(xmlResourceParser.getName())){ movies.add(movie); movie=null; } } type=xmlResourceParser.next(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } tv.setText(movies.toString()); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv=(TextView) findViewById(R.id.tv); } }
想要源码的点这:下载