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