您的位置:首页 > 其它

使用XmlPullParser解析XML

2014-02-28 14:05 337 查看
XML解析使用原始XML资源中都涉及过对XML的解析,之前使用的是DOM4J和XmlResourceParser来解析的。本文中将使用XmlPullParser来解析,分别解析不同复杂度的test1.xml、test2.xml、test3.xml。代码如下:

MainActivity:

package com.home.xmlparsetest;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import android.app.Activity;
import android.os.Bundle;
import android.util.Xml;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ExpandableListView;

public class MainActivity extends Activity implements OnClickListener {
	private Button parseBtn1;
	private Button parseBtn2;
	private Button parseBtn3;
	private ExpandableListView listView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		initWidget();
	}

	private void initWidget() {
		parseBtn1 = (Button) findViewById(R.id.main_btn_test1);
		parseBtn1.setOnClickListener(this);
		parseBtn2 = (Button) findViewById(R.id.main_btn_test2);
		parseBtn2.setOnClickListener(this);
		parseBtn3 = (Button) findViewById(R.id.main_btn_test3);
		parseBtn3.setOnClickListener(this);
		listView = (ExpandableListView) findViewById(R.id.list);
	}

	@Override
	public void onClick(View v) {
		if (v == parseBtn1) {
			InputStream is = getAssetsStream("test1.xml");
			List<ClassBean> list = parseFile1(is);
			listView.setAdapter(new MyAdapter(this, list));
		} else if (v == parseBtn2) {
			InputStream is = getAssetsStream("test2.xml");
			List<ClassBean> list = parseFile2(is);
			listView.setAdapter(new MyAdapter(this, list));
		} else if (v == parseBtn3) {
			InputStream is = getAssetsStream("test3.xml");
			List<ClassBean> list = parseFile3(is);
			listView.setAdapter(new MyAdapter(this, list));
		}
	}

	/**
	 * 得到Assets里面相应的文件流
	 * 
	 * @param fileName
	 * @return
	 */
	private InputStream getAssetsStream(String fileName) {
		InputStream is = null;
		try {
			is = getAssets().open(fileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return is;
	}

	/**
	 * 解析test1.xml
	 * 
	 * @param is
	 * @return list
	 */
	private List<ClassBean> parseFile1(InputStream is) {
		List<ClassBean> list = new ArrayList<ClassBean>();
		try {
			XmlPullParser parser = Xml.newPullParser();
			parser.setInput(is, "utf-8");
			int event = parser.getEventType();
			while (event != XmlPullParser.END_DOCUMENT) {
				switch (event) {
				case XmlPullParser.START_DOCUMENT:
					break;
				case XmlPullParser.START_TAG:
					if ("class".equals(parser.getName())) {
						ClassBean bean = new ClassBean();
						bean.setId(parser.getAttributeValue(0));
						bean.setName(parser.nextText());
						list.add(bean);
					}
					break;
				}
				event = parser.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 解析test2.xml
	 * 
	 * @param is
	 * @return list
	 */
	private List<ClassBean> parseFile2(InputStream is) {
		List<ClassBean> list = null;
		ClassBean bean = null;
		List<StudentBean> sList = null;
		StudentBean be = null;
		try {
			XmlPullParser parser = Xml.newPullParser();
			parser.setInput(is, "utf-8");
			int event = parser.getEventType();
			while (event != XmlPullParser.END_DOCUMENT) {
				switch (event) {
				case XmlPullParser.START_DOCUMENT:
					list = new ArrayList<ClassBean>();
					break;
				case XmlPullParser.START_TAG:
					if ("class".equals(parser.getName())) {
						bean = new ClassBean();
						bean.setId(parser.getAttributeValue(0));
						bean.setName(parser.getAttributeValue(1));
						sList = new ArrayList<StudentBean>();
					} else if ("student".equals(parser.getName())) {
						be = new StudentBean();
						be.setId(parser.getAttributeValue(0));
						be.setName(parser.nextText());
						sList.add(be);
					}
					break;
				case XmlPullParser.END_TAG:
					if ("class".equals(parser.getName())) {
						bean.setList(sList);
						list.add(bean);
						bean = null;
					}
					break;
				}
				event = parser.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 解析test3.xml
	 * 
	 * @param is
	 * @return list
	 */
	private List<ClassBean> parseFile3(InputStream is) {
		List<ClassBean> list = null;
		ClassBean bean = null;
		List<StudentBean> sList = null;
		StudentBean be = null;
		try {
			XmlPullParser parser = Xml.newPullParser();
			parser.setInput(is, "utf-8");
			int event = parser.getEventType();
			while (event != XmlPullParser.END_DOCUMENT) {
				switch (event) {
				case XmlPullParser.START_DOCUMENT:
					list = new ArrayList<ClassBean>();
					break;
				case XmlPullParser.START_TAG:
					if ("class".equals(parser.getName())) {
						bean = new ClassBean();
						bean.setId(parser.getAttributeValue(0));
						bean.setName(parser.getAttributeValue(1));
						sList = new ArrayList<StudentBean>();
					} else if ("student".equals(parser.getName())) {
						be = new StudentBean();
						be.setId(parser.getAttributeValue(0));
						sList.add(be);
					} else if ("name".equals(parser.getName())) {
						be.setName(parser.nextText());
					} else if ("sex".equals(parser.getName())) {
						be.setSex(parser.nextText());
					}
					break;
				case XmlPullParser.END_TAG:
					if ("class".equals(parser.getName())) {
						bean.setList(sList);
						list.add(bean);
						bean = null;
					}
					break;
				}
				event = parser.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
}

MyAdapter:

package com.home.xmlparsetest;

import java.util.List;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MyAdapter extends BaseExpandableListAdapter {
	private List<ClassBean> classList;
	private Context context;

	public MyAdapter(Context context, List<ClassBean> classList) {
		this.context = context;
		this.classList = classList;
	}

	@Override
	public Object getChild(int groupPosition, int childPosition) {
		List<StudentBean> sList = classList.get(groupPosition).getList();
		StudentBean be = null;
		if (sList != null) {
			be = sList.get(childPosition);
		}
		return be;
	}

	@Override
	public long getChildId(int groupPosition, int childPosition) {
		return childPosition;
	}

	@Override
	public View getChildView(int groupPosition, int childPosition,
			boolean isLastChild, View convertView, ViewGroup parent) {
		LinearLayout ll = new LinearLayout(context);
		ll.setOrientation(LinearLayout.HORIZONTAL);
		List<StudentBean> sList = classList.get(groupPosition).getList();

		if (sList != null && sList.size() > 0
				&& sList.get(childPosition).getId() != null) {
			TextView tv1 = getTextView2();
			tv1.setText(sList.get(childPosition).getId());
			ll.addView(tv1);
		}

		if (sList != null && sList.size() > 0
				&& sList.get(childPosition).getName() != null) {
			TextView tv2 = getTextView2();
			tv2.setText(sList.get(childPosition).getName());
			ll.addView(tv2);
		}

		if (sList != null && sList.size() > 0
				&& sList.get(childPosition).getSex() != null) {
			TextView tv3 = getTextView2();
			tv3.setText(sList.get(childPosition).getSex());
			ll.addView(tv3);
		}
		return ll;
	}

	@Override
	public int getChildrenCount(int groupPosition) {
		int size = 0;
		List<StudentBean> sList = classList.get(groupPosition).getList();
		if (sList != null) {
			size = sList.size();
		}
		return size;
	}

	@Override
	public Object getGroup(int groupPosition) {
		return classList.get(groupPosition);
	}

	@Override
	public int getGroupCount() {
		return classList.size();
	}

	@Override
	public long getGroupId(int groupPosition) {
		return groupPosition;
	}

	@Override
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent) {
		LinearLayout ll = new LinearLayout(context);
		ll.setOrientation(LinearLayout.HORIZONTAL);
		TextView tv1 = getTextView1();
		tv1.setText(classList.get(groupPosition).getId());
		ll.addView(tv1);

		TextView tv2 = getTextView1();
		tv2.setText(classList.get(groupPosition).getName());
		ll.addView(tv2);
		return ll;
	}

	@Override
	public boolean hasStableIds() {
		return true;
	}

	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		return true;
	}

	private TextView getTextView1() {
		LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
				ViewGroup.LayoutParams.WRAP_CONTENT,
				ViewGroup.LayoutParams.WRAP_CONTENT);
		lp.setMargins(0, 0, 20, 0);
		TextView tv = new TextView(context);
		tv.setLayoutParams(lp);
		tv.setGravity(Gravity.CENTER_VERTICAL);
		tv.setPadding(36, 0, 0, 0);
		tv.setTextSize(25);
		return tv;
	}

	private TextView getTextView2() {
		LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
				ViewGroup.LayoutParams.WRAP_CONTENT,
				ViewGroup.LayoutParams.WRAP_CONTENT);
		lp.setMargins(20, 0, 50, 0);
		TextView tv = new TextView(context);
		tv.setLayoutParams(lp);
		tv.setGravity(Gravity.CENTER_VERTICAL);
		tv.setPadding(36, 0, 0, 0);
		tv.setTextSize(18);
		return tv;
	}
}

ClassBean实体类:

package com.home.xmlparsetest;

import java.util.List;

public class ClassBean {
	private String id;
	private String name;
	private List<StudentBean> list;

	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 List<StudentBean> getList() {
		return list;
	}

	public void setList(List<StudentBean> list) {
		this.list = list;
	}

}

StudentBean:

package com.home.xmlparsetest;

public class StudentBean {
	private String id;
	private String name;
	private String sex;

	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 getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

}

布局文件main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/main_btn_test1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="解析test1" />

        <Button
            android:id="@+id/main_btn_test2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="解析test2" />

        <Button
            android:id="@+id/main_btn_test3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="解析test3" />
    </LinearLayout>

    <ExpandableListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ExpandableListView>

</LinearLayout>

assets里面的test1.xml:

<?xml version="1.0" encoding="utf-8"?>
<classList>

    <class id="1">一班</class>

    <class id="2">二班</class>

    <class id="3">三班</class>

    <class id="4">四班</class>

</classList>

assets里面的test2.xml:

<?xml version="1.0" encoding="utf-8"?>
<classList>

    <class id="1" name="一班" >
        <student id="1" >张三       </student>
        <student id="2" >李四      </student>
    </class>

    <class id="2" name="二班" >
        <student id="3" >王五</student>
        <student id="4" >赵六</student>
    </class>

    <class id="3" name="三班" >
        <student id="5" >小明</student>
        <student id="6" >小高 </student>
    </class>

    <class id="4" name="四班" >
        <student id="7" >小花</student>
        <student id="8" >小红 </student>
    </class>

</classList>

assets里面的test3.xml:

<?xml version="1.0" encoding="utf-8"?>
<classList>

    <class id="1" name="一班" >
       <student id="1" >
           <name>张三</name>
           <sex>男</sex>
       </student>
       <student id="2" >
           <name>李四</name>
           <sex>男</sex>
       </student>
    </class>

    <class id="2" name="二班" >
       <student id="3" >
           <name>王五</name>
           <sex>男</sex>
       </student>
       <student id="4" >
           <name>赵六</name>
           <sex>男</sex>
       </student>
    </class>

    <class id="3" name="三班" >
        <student id="5" >
           <name>小明</name>
           <sex>男</sex>
       </student>
        <student id="6" >
           <name>小高</name>
           <sex>男</sex>
       </student>
    </class>

    <class id="4" name="四班" >
       <student id="7" >
           <name>小花</name>
           <sex>女</sex>
       </student>
       <student id="8" >
           <name>小红</name>
           <sex>女</sex>
       </student>
    </class>

</classList>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: