android之Pull解析XML文件

  Android默认使用内置的Pull解析器来解析xml文件。虽然SAXDOM解析也能用,推荐使用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:

android之Pull解析XML文件_第1张图片

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    解析到开始标签


5.MainActivity:

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

效果图:




想要源码的点这:下载
















你可能感兴趣的:(xml,pull解析,安卓)