XML文件解析之PULL解析

前端之家收集整理的这篇文章主要介绍了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大小以及以及需求要合适的采用相应的解析方式。

原文链接:https://www.f2er.com/xml/295589.html

猜你在找的XML相关文章