android中读写xml文件

    android中经常会遇到要读取或者写入一些xml文件,如某些网站的请求返回就是xml格式的。这样,我们得到文件流可以对xml文件进行解析,进而得到里面的一些我们所需要的参数。xml文件的解析方式有三种:DOM(Document Object Model)、SAX(Simple API for Xml)和android自带的pull解析。

    DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML起来比较直观,实现也比较简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以我们一般还是采用SAX方式或者android自带的Pull方式。SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。这些事件定义在ContentHandler接口中。Pull方式和SAX比较类似,也是我用的最多的一种。Pull提供了开始元素(START_DOCUMENT,START_TAG)和结束元素事件(END_DOCUMENT,END_TAG),使用parser.next()可以进入下一个元素并触发相应事件。 

   看一段简单的代码:

	public void ReadXml()
	{
		try
		{
			FileInputStream fis = context.openFileInput("params.xml");
			XmlPullParser xParser = Xml.newPullParser();

			xParser.setInput(fis, "UTF-8");
			int eventCode = xParser.getEventType();
			while (eventCode != XmlPullParser.END_DOCUMENT)//遇到结束元素事件停止循环
			{
				switch (eventCode)
				{
				case XmlPullParser.START_DOCUMENT:// 0文档开始事件
					break;
				case XmlPullParser.START_TAG:// 2开始元素

					if ("sex".equals(xParser.getName()))
					{
						str1 = xParser.nextText();//获取value内容
						Log.e("", str1);
					} else if ("age".equals(xParser.getName()))
					{
						str2 = xParser.nextText();
					}
					break;
				}
				eventCode = xParser.next();// 指针转到下一个位置
			}
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XmlPullParserException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


上述代码很容易就能懂,即是从文件头到文件尾进行判断,遇到和自己需要的元素相等的时候,取出其中的value值。

上面是读一个xml文件并且解析,让我们再来看看怎么写一个xml文件。看代码,都有清楚的注释:

	public String WriteXml(String str1, String str2)
	{
		XmlSerializer serializer = Xml.newSerializer();//实例化
		StringWriter strWriter = new StringWriter();
		try
		{
			serializer.setOutput(strWriter);

			// <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
			serializer.startDocument("UTF-8", true);

			// <Author name="Tony">
			serializer.startTag("", "Author");
			serializer.attribute("", "name", "Tony");

			// <message date="2013.12.13">
			serializer.startTag("", "message");
			serializer.attribute("", "date", "2013.12.13");

			// <sex>Male</sex>
			serializer.startTag("", "sex");
			serializer.text(str1);
			serializer.endTag("", "sex");

			// <age>23</age>
			serializer.startTag("", "age");
			serializer.text(str2);
			serializer.endTag("", "age");

			// </message>
			serializer.endTag("", "message");

			// </Author>
			serializer.endTag("", "Author");
			serializer.endDocument();

			return strWriter.toString();
		} catch (IllegalArgumentException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

下图是上面方法的返回值:

	public boolean Write(String writeString, String name)
	{
		try
		{
			OutputStream oStream = context.openFileOutput(name, context.MODE_PRIVATE);//这种方式将会把要写入的文件(name)保存到
			OutputStreamWriter osw = new OutputStreamWriter(oStream);				  //“/data/data/'package name'/file”目录下

			osw.write(writeString);//writeString是要写入的我们刚刚写好的“String WriteXml”
			osw.close();
			oStream.close();

		} catch (FileNotFoundException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}


这两个方法分别完成了组合xml文档和将其保存到默认目录下。代码下载:http://download.csdn.net/detail/luckytzq/6711695

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值