在网络存储过程中有很多时候会遇到XML文件解析和使用XML保存一些信息,解析XML文件用的比较多的方法是pull解析和SAX解析,但是我一般只用pull解析,下面就向cd卡写入一个XML文件,然后再使用pull解析的方法对文件进行解析。
一、向SD卡中写入一个XML文件:
/**
* 向SD卡写入一个XML文件
*
* @param v
*/
public void savexml(View v) {
try {
File file = new File(Environment.getExternalStorageDirectory(),
"persons.xml");
FileOutputStream fos = new FileOutputStream(file);
// 获得一个序列化工具
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(fos, "utf-8");
// 设置文件头
serializer.startDocument("utf-8", true);
serializer.startTag(null, "persons");
for (int i = 0; i < 10; i++) {
serializer.startTag(null, "person");
serializer.attribute(null, "id", String.valueOf(i));
// 写姓名
serializer.startTag(null, "name");
serializer.text("张三" + i);
serializer.endTag(null, "name");
// 写性别
serializer.startTag(null, "gender");
serializer.text("男" + i);
serializer.endTag(null, "gender");
// 写年龄
serializer.startTag(null, "age");
serializer.text("1" + i);
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
fos.close();
Toast.makeText(MainActivity.this, "写入成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "写入失败", 0).show();
}
}
1、设置XML文件保存的地址,2、获得一个序列化工具,3、写XML文件的头,4、循环写入信息。
最后得到的XML文件
二、解析本地XML文件
/**
* 读取SD卡中的XML文件,使用pull解析
*
* @param v
*/
public void readxml(View v) {
try {
File path = new File(Environment.getExternalStorageDirectory(),
"persons.xml");
FileInputStream fis = new FileInputStream(path);
// 获得pull解析器对象
XmlPullParser parser = Xml.newPullParser();
// 指定解析的文件和编码格式
parser.setInput(fis, "utf-8");
int eventType = parser.getEventType(); // 获得事件类型
String id = null;
String name = null;
String gender = null;
String age = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName(); // 获得当前节点的名称
switch (eventType) {
case XmlPullParser.START_TAG: // 当前等于开始节点 <person
if ("persons".equals(tagName)) { // <persons
} else if ("person".equals(tagName)) { // <person id="1"
id = parser.getAttributeValue(null, "id");
} else if ("name".equals(tagName)) { // <name
name = parser.nextText();
}else if ("gender".equals(tagName)) { // <age
gender = parser.nextText();
} else if ("age".equals(tagName)) { // <age
age = parser.nextText();
}
break;
case XmlPullParser.END_TAG: // </persons
if ("person".equals(tagName)) {
Log.i(TAG, "id---" + id);
Log.i(TAG, "name---" + name);
Log.i(TAG, "gender---" + gender);
Log.i(TAG, "age---" + age);
}
break;
default:
break;
}
eventType = parser.next(); // 获得下一个事件类型
}
} catch (Exception e) {
e.printStackTrace();
}finally{
}
1、获取要解析XML文件的地址,2、获得pull解析工具,3、根据标签的不同判断并保存信息。
在解析过程中遇到一个问题,就是在解析完了之后,调用fis.close()函数时,会报bad file number的错误,检查了很久才发现是这句话的问题。
补充知识:Android 读取raw下的xml配置文件
1、获取数据流
// 读取配置文件 InputStream in = context.getResources().openRawResource(R.raw.cfg);
2、解析xml文件
public class XmlParser<T {
public T xmlParser(InputStream xml) throws Exception {
XmlPullParser pullParse = Xml.newPullParser();
pullParse.setInput(xml, "UTF-8");
int event = pullParse.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
//文件开头
break;
case XmlPullParser.START_TAG:
//标签开始标志
//pullParse.getName() 获取标签名
//pullParse.getAttributeValue(0)获取标签的参数
//pullParse.nextText() 获取标签内的值
break;
case XmlPullParser.END_TAG:
//标签结束标志
break;
}
event = pullParse.next();//进行下一个标签的解析
}
return T;
}
}
以上这篇Android实现向本地写入一个XML文件和解析XML文件就是小编分享给大家的全部内容了,希望能给大家一个参考。