XML文件解析之PULL解析

1.PULL概念
PULL解析XML的方式与SAX解析XML方式一样,也是基于事件驱动。
XmlPullParse中定义的常量:
START_DOCUMET: 读取到XML的声明返回
START_TAG:           读取到XML的开始标签返回
TEXT:                      读取到XML的文本返回
END_TAG:               读取到XML的结束标签返回
END_DOCUMET:    读取到XML的结束返回

2.解析步骤

(1)创建XmlPullParserFactory对象(newInstance())

(2)根据XmlPullParserFactory对象的newPullParser()方法创建XmlPullParser解析器对象

(3)使用XmlPullParser的setInput方法设置输入流以及编码

(4)通过XmlPullParser的getEventType来获得PULL解析常用事件类型

(5)通过XmlPullParser的next获取下一个元素并触发相应事件


3.实例

需要解析的xml:

<?xml version="1.0" encoding="utf-8"?>
	<students>
		<student id="0">
			<name>zhangmq</name>
			<gender>female</gender>
			<age>24</age>
		</student>
		<student id="1">
			<name>zhouhy</name>
			<gender>male</gender>
			<age>24</age>
		</student>
	</students>
解析:

public class PullParseActivity extends Activity {

	private TextView pull_parse_tv;

	List<Student> students;

	Student student;

	String nodeName;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_pull);
		pull_parse_tv = (TextView) findViewById(R.id.pull_parse);
		pull_parse_tv.setText(pullParseXml());
	}

	private String pullParseXml() {
		String str = "";
		XmlPullParserFactory factory = null;
		XmlPullParser parse = null;
		InputStream is = null;
		try {
			is = getResources().getAssets().open("dom_info.xml");
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			factory = XmlPullParserFactory.newInstance();
			factory.setNamespaceAware(true);
			parse = factory.newPullParser();
			parse.setInput(is, "UTF-8");
			//定义pull解析常用事件类型
			int eventType = parse.getEventType();
			while (eventType != XmlPullParser.END_DOCUMENT) {
				if (eventType == XmlPullParser.START_DOCUMENT) {
					Log.d("zhangmq", "XmlPullParser.START_DOCUMENT");
					students = new ArrayList<Student>();
				} else if (eventType == XmlPullParser.START_TAG) {
					nodeName = parse.getName();
					if (("student").equals(nodeName)) {
						student = new Student();
						students.add(student);
						student.setId(parse.getAttributeValue(0));
					}

				} else if (eventType == XmlPullParser.END_TAG) {
					Log.d("zhangmq", "XmlPullParser.END_TAG");
					// 在END_TAG时,设置nodeName为null,避免解析到END_TAG,同样的parse.getName(),
					// 但是parse.getText()为空的情况
					nodeName = null;
					if (parse.getName().equals("student")) {
						str = str + student.toString() + "\n";
					}
				} else if (eventType == XmlPullParser.TEXT) {
					Log.d("zhangmq", "XmlPullParser.TEXT ");
					if (("name").equals(nodeName)) {
						student.setName(parse.getText());
					} else if (("gender").equals(nodeName)) {
						student.setGender(parse.getText());
					} else if (("age").equals(nodeName)) {
						student.setAge(parse.getText());
					}

				}
				try {
					//获取下一个解析事件
					eventType = parse.next();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return str;
	}

}

4.PULL解析与SAX解析的差别

SAX解析的工作方式是解析开始后不能控制事件的处理主动结束,处理过程自动进行。

PULL解析的工作方式是开始解析后允许应用从解析器中获取事件,可以在满足了需要的条件后不再获取事件,结束解析。


个人感觉DOM SAX PULL三种解析方式中,PULL的使用最简单。

当然也要根据需要处理的xml大小以及以及需求要合适的采用相应的解析方式。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值