xml解析

1.SAX解析SAX特点:优点:不用实现调入整个文档,占用资源少。尤其在嵌入式环境中,如android,极力推荐使用SAX解析。

缺点:不像DOM解析一样将文档长期驻留在内存中,数据不是持久的。如果事件过后没有保存数据,数据就会丢失。SAX解析XML文档采用事件驱动模式。什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。基于事件驱动的处理模式主要是基于事件源和事件处理器(或者叫监听器)来工作的。一个可以产生事件的对象叫做事件源,而一个可以针对事件做出响应的对象就被叫做事件处理器。

使用:继承DefaultHandler类 需要重写的方便 :characters(),endDocument(),endElement(),startElement(),startDocument()

使用sax来解析代码

			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			parser.parse(inStream, this);


2.DOM解析

特点:

DOM解析XML会将XML文件的所有内容以文档树方式存放在内在中,然后允许您使用DOMAPI遍历XML树、检索所需的数据。因为DOM需要将XML文件的所有内容以文档树方式存入在内在中,所以内在的消耗比较大。

3.Pull解析
Pull解析和Sax解析相似,提供了类似的事件。
使用方式:
XmlPullParser parser = Xml.newPullParser();
		parser.setInput(FileInputStream, "UTF-8");
		int eventType = parser.getEventType();
		while (eventType != XmlPullParser.END_DOCUMENT) {
			String name = parser.getName();
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList<Ch05Ex03.Person>();
				break;
			case XmlPullParser.START_TAG:
				if ("person".equals(name)) {
					person = new Person();
				} else if ("id".equals(name)) {
					person.id = Integer.valueOf(parser.nextText());
				} else if ("name".equals(name)) {
					person.name = parser.nextText();
				} else if ("age".equals(name)) {
					person.age = Integer.valueOf(parser.nextText());
				}
				break;
			case XmlPullParser.END_TAG:
				if ("person".equals(name)) {
					persons.add(person);
					person = null;
				}
				break;
			}
			eventType = parser.next();
		}









4.Pull生成XML
FileOutputStream outStream = null;
		try {
			File file1 = new File(Environment.getExternalStorageDirectory()
					+ File.separator + "cgh" + File.separator);
			if (!file1.exists())
				file1.mkdir();
			File file2 = new File(file1, "a.xml");
			outStream = new FileOutputStream(file2);

			// 生成XML
			XmlSerializer serializer = Xml.newSerializer();
			serializer.setOutput(outStream, "UTF-8");
			serializer.startDocument("UTF-8", true);
			serializer.startTag(null, "persons");
			// 循环List取数据
			for (Person p : persons) {
				serializer.startTag(null, "person");

				serializer.startTag(null, "id");
				serializer.text(p.id + "");
				serializer.endTag(null, "id");

				serializer.startTag(null, "name");
				serializer.text(p.name + "");
				serializer.endTag(null, "name");

				serializer.startTag(null, "age");
				serializer.text(p.age + "");
				serializer.endTag(null, "age");

				serializer.endTag(null, "person");
			}
			serializer.endTag(null, "persons");
			serializer.endDocument();
			Toast.makeText(this, "生成XML完成", Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			Log.e(tag, e.getMessage());
			e.printStackTrace();
		} finally {
			try {
				if (outStream != null)
					outStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
5.SharedPreferences存储数据
		SharedPreferences sp = this.getSharedPreferences("b", Context.MODE_APPEND);
		Editor editor = sp.edit();
		editor.putString("name", name.getText() + "");
		editor.putString("age", age.getText() + "");
		editor.commit();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值