Android XML Pull解析

android 客户端和后台服务器交互数据使用XML格式的时候,我们会想到DOM解析器,SAX解析器,但是DOM解析在解析XML文档时是将整个文档加载到内存中进行解析这样操作是方便了,但是太消耗资源,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。

在android系统提供的Pull解析器,它提供了类似的事件,如: 开始元素和结束元素事件,使用parser.next() 可以进入下一个元素并触发相应事件。跟 SAX 不同的 是, Pull 解析器产生的事件是一个数字,而非方法,因此可以使用一个 switch 对感兴趣的事件 进行处理。当元素开始解析时,调用 parser.nextText() 方法可以获取下一个 Text 类型节点的值。


private List<Person> parseXML(InputStream in) {
		List<Person> list = null;
		Person person = null;
		try {
			XmlPullParser newPullParser = XmlPullParserFactory.newInstance().newPullParser();
			// XmlPullParser parse = Xml.newPullParser(); 另一种方法
			// 设置读取路径和编码
			newPullParser.setInput(in, "utf-8");
			int eventType = newPullParser.getEventType();
			while (eventType != XmlPullParser.END_DOCUMENT) {
				switch (eventType) {
				case XmlPullParser.START_DOCUMENT:
					break;
					
				case XmlPullParser.START_TAG:
					String name = newPullParser.getName();
					if(TextUtils.equals("persons", name)) {
						list = new ArrayList<Person>();
					} else if(TextUtils.equals("person", name)) {
						person = new Person();
						String id = newPullParser.getAttributeValue(null, "id");
						person.setId(Integer.parseInt(id));
					} else if(TextUtils.equals("name", name)) {
						String personName = newPullParser.nextText();
						person.setName(personName);
					} else if(TextUtils.equals("age", name)) {
						String age = newPullParser.nextText();
						person.setAge(Integer.parseInt(age));
					}
					break;
					
				case XmlPullParser.END_TAG:
					String endTagName = newPullParser.getName();
					if(TextUtils.equals("person", endTagName)) {
						list.add(person);
					}
					break;
					
				case XmlPullParser.END_DOCUMENT:
					
					break;

				default:
					break;
				}
				eventType = newPullParser.next();
			}
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.createXMl:
			File file = new File(Environment.getExternalStorageDirectory(), "persons.xml");
			try {
				FileOutputStream out = new FileOutputStream(file);
				createXML(out);
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			break;
			
		case R.id.parseXML:
			File fileIn = new File(Environment.getExternalStorageDirectory(), "persons.xml");
			try {
				FileInputStream in = new FileInputStream(fileIn);
				List<Person> list = parseXML(in);
				for(Person person : list) {
					Log.i("MainActivity", person.toString());
				}
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			break;

		default:
			break;
		}
	}



public class Person {
	public int id;
	public String name;
	public int age;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

}

private void createXML(OutputStream os) {
		try {
			// 创建XML生成器
			XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
			// XmlSerializer newSerializer = Xml.newSerializer(); 另一种方法
			// 设置输出路径和编码
			serializer.setOutput(os, "utf-8");
			// 开始文档
			serializer.startDocument("utf-8", null);
			// 开始标记
			serializer.startTag(null, "persons");
			serializer.startTag(null, "person");
			// 设置属性
			serializer.attribute(null, "id", "1");
			serializer.startTag(null, "name");
			// 赋值
			serializer.text("张三");
			serializer.endTag(null, "name");
			serializer.startTag(null, "age");
			serializer.text("18");
			serializer.endTag(null, "age");
			serializer.endTag(null, "person");
			
			serializer.startTag(null, "person");
			serializer.attribute(null, "id", "2");
			serializer.startTag(null, "name");
			serializer.text("李四");
			serializer.endTag(null, "name");
			serializer.startTag(null, "age");
			serializer.text("30");
			serializer.endTag(null, "age");
			serializer.endTag(null, "person");
			
			serializer.startTag(null, "person");
			serializer.attribute(null, "id", "3");
			serializer.startTag(null, "name");
			serializer.text("王武");
			serializer.endTag(null, "name");
			serializer.startTag(null, "age");
			serializer.text("108");
			serializer.endTag(null, "age");
			serializer.endTag(null, "person");
			// 结束标记
			serializer.endTag(null, "persons");
			// 结束文档
			serializer.endDocument();
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值